精华内容
下载资源
问答
  • 常见图片格式详解

    2021-05-27 07:42:11
    做了几年有关图形、图像的工作,对图片格式算是小有经验,在此写成一文章总结下。虽然一开始并不想讲很理论的东西,但写完后发现几乎全是理论,细想一下关于图片格式的知识本身就是理论的东西,囧~~ 那就力求用最...

    做了几年有关图形、图像的工作,对图片格式算是小有经验,在此写成一文章总结下。虽然一开始并不想讲很理论的东西,但写完后发现几乎全是理论,细想一下关于图片格式的知识本身就是理论的东西,囧~~ 那就力求用最简单的方式将这些“理论”讲清楚吧。

    常见的图片格式有bmp, jpg(jpeg), png, gif, webp等。图像基本数据结构

    要讲图片格式还先得从图像的基本数据结构说起。在计算机中, 图像是由一个个像素点组成,像素点就是颜色点,而颜色最简单的方式就是用RGB或RGBA表示, 如图所示

    68805914_1

    (图1)

    68805914_2

    (图2)

    如果有A通道就表明这个图像可以有透明效果。

    R,G,B每个分量一般是用一个字节(8位)来表示,所以图(1)中每个像素大小就是3*8=24位图, 而图(2)中每个像素大小是4*8=32位。

    这里有三点需要说明:一、图像y方向正立或倒立图像是二维数据,数据在内存中只能一维存储,二维转一维有不同的对应方式。比较常见的只有两种方式: 按像素“行排列”从上往下或者从下往上。

    68805914_3

    如图所示的图像有9个像素点,如果从上往下排列成一维数据是(123456789), 如果是从下往上排列则为(789456123)。 只所以会有这种区别是因为,前一种是以计算机图形学的屏幕坐标系为参考(右上为原点,y轴向下 ),而另后一种是以标准的数学坐标系为参考(右下为原点,y轴向上)。这两个坐标系只是y值不一样,互相转换的公式为:

    y2 = height-1-y1

    y1,y2分别为像素在两个坐标系中的y坐标,height为图像的高度。

    不过好像只有bmp图片格式以及windows下的GDI,GDI+是从下往上排列,其它比如DirectX,OpenGL,Cocoa(NSImage, UIImage),OpenCV等都是从上往下排列。二、RGB排列顺序

    不同图形库中每个像素点中RGBA的排序顺序可能不一样。上面说过像素一般会有RGB,或RGBA四个分量,那么在内存中RGB的排列就有6种情况,如下:

    RGBA的排列有24种情况,这里就不全部列出来了。不过一般只会有RGB,BGR, RGBA, RGBA, BGRA这几种排列据。 绝大多数图形库或环境是BGR/BGRA排列,cocoa中的NSImage或UIImage是RGBA排列。三、像素32位对齐

    如果是RGB24位图,会存在一个32位对齐的问题——

    在x86体系下,cpu一次处理32整数倍的数据会更快,图像处理中经常会按行为单位来处理像素。24位图,宽度不是4的倍数时,其行字节数将不是32整数倍。这时可以采取在行尾添加冗余数据的方式,使其行字节数为32的倍数。

    比如,如果图像宽为5像素,不做32位对齐的话,其行字节数为24*5=120,120不是32的倍数。是32整数倍并且刚好比120大的数是128,也就只需要在其行尾添加1字节(8位)的冗余数据即可。(一个以空间换时间的例子)

    有个公式可以轻松计算出32位对齐后每行应该占的字节数

    byteNum = ((width * 24 + 31) & ~31)>>3;

    注意结果是字节数,如果想知道位数,还得x8图片格式的必要性

    如果将图像原始格式直接存储到文件中将会非常大,比如一个5000*5000 24位图,所占文件大小为5000*5000*3字节=71.5MB, 其大小非常可观。

    如果用zip或rar之类的通用算法来压缩像素数据,得到的压缩比例通常不会太高,因为这些压缩算法没有针对图像数据结构进行特殊处理。

    于是就有了jpeg,png等格式,同样是图像压缩算法jpeg和png也有不同的适用场景,具体在下文再阐述。

    68805914_4

    所以可以总结如下: jpeg,png文件之于图像,就相当于zip,rar格式之于普通文件(用zip,rar格式对普通文件进行压缩)。BMP格式

    bmp格式没有压缩像素格式,存储在文件中时先有文件头、再图像头、后面就都是像素数据了,上下颠倒存储。

    用windows自带的mspaint工具保存bmp格式时,可以发现有四种bmp可供选择:

    单色: 一个像素只占一位,要么是0,要么是1,所以只能存储黑白信息

    16色位图: 一个像素4位,有16种颜色可选

    256色位图: 一个像素8位,有256种颜色可选

    24位位图: 就是图(1)所示的位图,颜色可有2^24种可选,对于人眼来说完全足够了。

    这里为了简单起见,只详细讨论最常见的24位图的bmp格式。

    现在来看其文件头和图片格式头的结构:

    文件头信息

    字段大小(字节)描述

    bfType2一定为19778,其转化为十六进制为0x4d42,对应的字符串为BM

    bfSize4文件大小

    bfReserved12一般为0

    bfReserved22一般为0

    bfOffBits4从文件开始处到像素数据的偏移,也就是这两个结构体大小之和

    bmp图片结构头

    字段大小(字节)描述

    biSize4此结构体的大小

    biWidth4图像的宽

    biHeight4图像的高

    biPlanes2图像的帧数,一般为1

    biBitCount2一像素所占的位数,一般是24

    biCompression4一般为0

    biSizeImage4像素数据所占大小,即上面结构体中文件大小减去偏移(bfSize-bfOffBits)

    biXPelsPerMeter4一般为0

    biXPelsPerMeter4一般为0

    biClrUsed4一般为0

    biClrImportant4一般为0

    本来在windows平台下wingdi.h文件中已经有这些结构的定义,不过为了不依赖与windows,实现为跨平台,本人将wingdi.h中的这两个结构“偷用”出来了。代码如下:1 //bmp文件头2 #pragma pack(push)3 #pragma pack(2)4 typedef struct tagBITMAPFILEHEADER {5 unsigned short bfType; // 19778,必须是BM字符串,对应的十六进制为0x4d42,十进制为197786 unsigned int bfSize; // 文件大小7 unsigned short bfReserved1; // 08 unsigned short bfReserved2; // 09 unsigned int bfOffBits; // 从文件头到像素数据的偏移,也就是这两个结构体的大小之和10 } BITMAPFILEHEADER;11 #pragma pack(pop)1213 //bmp图像头14 typedef struct tagBITMAPINFOHEADER {15 unsigned int biSize; // 此结构体的大小16 int biWidth; // 图像的宽17 int biHeight; // 图像的高18 unsigned short biPlanes; // 119 unsigned short biBitCount; // 2420 unsigned int biCompression; // 021 unsigned int biSizeImage; // 像素数据所占大小, 这个值应该等于上面文件头结构中bfSize-bfOffBits22 int biXPelsPerMeter; // 023 int biYPelsPerMeter; // 024 unsigned int biClrUsed; // 025 unsigned int biClrImportant;// 026 } BITMAPINFOHEADER;

    Bmp结构体

    由于bmp格式比较简单,本人已实现了一份简单的c++代码,具有读取、保存bmp图片的功能,只支持24位的bmp格式。

    代码在 http://git.oschina.net/xiangism/blogData 的“常见图片格式详解/ImageDemo/BmpDemo”文件夹中。

    虽然这里只建立了vs2008项目,但代码在linux, mac平台下都可以编译通过。

    需要说明的是为了统一处理,将bmp读取到LBitmap::m_pixel中时就将其转化为32位从上往下排列的图像格式了。并且会有y坐标的转化。所以在读取的时候会有一个temp_line先存储文件中的24位数据,再转化为32位数据。在保存时也是先将32位数据转化到temp_line的24位数据上,然后再写入文件。(如果仅仅是处理bmp,那么这么多的一个A通道是冗余数据,但后面处理png图片时就会用到这个A通道)

    如果用上面的代码来读取如图所示的图片(放大8倍后的显示图):

    68805914_5

    右上角像素为RGB(255, 128, 0)1 ln::LBitmap bmp;2 bmp.ReadBmp(L'one.bmp');3 unsigned char *p = bmp.Pixel(0, 0);4 printf('%d, %d, %d\n', p[0], p[1], p[2]); //显示左上角的像素值5 bmp.WriteBmp(L'out.bmp'); //保存到文件,可以测试是否能正确读取和保存bmp

    运行的结果为: 0,128,255可以看出像素分布为BGR

    ps:bmp格式也是可以压缩.

    bmp格式也可以有颜色板。颜色板就是一个颜色的索引,上面说过bmp格式一个像素可以只有2个,16个或256个取值。就拿单色位图来说明,默认为0对应RGB(0,0,0) 1,对应RGB(255, 255, 255)如果颜色板这样定义:0对应 RGB(255,0, 0)红1对应 RGB(0, 255, 0)绿这样黑白图就成了红绿图JPEG格式jpeg是有损压缩格式, 将像素信息用jpeg保存成文件再读取出来,其中某些像素值会有少许变化。在保存时有个质量参数可在[0,100]之间选择,参数越大图片就越保真,但图片的体积也就越大。一般情况下选择70或80就足够了。

    jpeg没有透明信息。

    jpeg比较适合用来存储相机拍出来的照片,这类图像用jpeg压缩后的体积比较小。其使用的具体算法核心是离散余弦变换、Huffman编码、算术编码等技术,有兴趣的同学可以在网上找一大堆资料,本文就不详细介绍了。

    接下来要介绍一个有关jpeg非常实用的技术——

    jpeg格式支持不完全读取整张图片,即可以选择读取原图、1/2、1/4、1/8大小的图片

    比如5000*5000的一张大图,可以只读取将其缩小成1/8后即625*625大小的图片。 这样比先完全读取5000*5000的图像,再用算法缩小成625*625大小不知快多少倍。

    如果应用需求只需要一张小图时,这种读取方式就可以大显身手了。

    在c代码中读取jpeg一般是使用libjpeg, 这个库提供了不完全读取图片的功能。

    给ln::LBitmap添加有关jpeg的接口,如下ReadJpeg第三个参数fraction可取值为1,2,4,8,分别对应1/1,1/2,1/4,1/8```在上面LBitmap的基本上加入下面5个函数:// 不读取像素数据,只读取jpeg文件的大小, 用指针*width, *height做为传出参数, 返回值bool返回文件是否为jpeg格式static bool ReadJpegSize(const wchar_t *path, int *width, int *height);// 判断文件是否为jpeg格式static bool IsJpegFile(const wchar_t *fileame);// 读取jpeg,fraction可取值为1, 2, 4, 8bool ReadJpeg(const wchar_t *filename, int fraction = 1);// 按照width, height的大小读取合适的jpeg大小, 所得的图像大小不会超过width*heightbool ReadFitJpeg(const wchar_t *filename, int width, int height);// 保存jpeg,quality范围是[0, 100]bool WriteJpeg(const wchar_t *filename, int quality = 80);```

    JpegAPI

    具体的实现在JpegDemo用上面的函数进行jpeg的读取和保存的测试```ln::LBitmap bmp;bmp.ReadBmp(L'one.bmp');unsigned char *p = bmp.Pixel(0, 0);printf('%d, %d, %d\n', p[0], p[1], p[2]);bmp.WriteJpeg(L'one.jpg', 90);```

    读取one.bmp图片,然后保存成jpeg格式,one.jpg放大后显示如下

    68805914_6

    发现左上角的颜色发生了变化,并且也影响到周围的像素,就算将上面WriteJpeg第二个参数换成100,也还是这种效果,这是Jpeg格式无法避免的问题但如果读取一张风景照,再保存成Jpeg,就几乎看不出有什么差别了。android平台下实现jpeg预读BitmapFactory.Options opt = new BitmapFactory.Options;opt.inJustDecodeBounds = true;BitmapFactory.decodeFile(info.fullPath, opt); //这里仅仅只读取jpeg的大小opt.inJustDecodeBounds = false;if (opt.outWidth > opt.outHeight) {opt.inSampleSize = opt.outWidth / phSize;//hpSize是允许的图片宽高的最大值} else {opt.inSampleSize = opt.outHeight / phSize;}Bitmap b = BitmapFactory.decodeFile(info.fullPath, opt);

    将BitmapFactory.Options的inJustDecodeBounds 设置为true后,就只会读取Jpeg的大小,而不会去解析像素数据。然后再设置inSampleSize后,就可以根据这个值来读取适当大小的图片,研究android的源码后可以发现底层也是调用的libjpeg库来实现。ios,mac

    本人还没有在ios/mac中发现如何预读jpeg的官方API。Apple对图形、图像、多媒体领域提供了丰富接口,如果这个功能真没实现就太令我惊讶了! 不过ObjectC完全兼容C,可以调用libjpeg库来实现这个功能。.NET下仅读取jpeg的大小

    下面是用c#仅仅读取jpeg宽高(没有解析像素数据), 直接用C#读取1/2,1/4,1/8还不知道如何实现FileStream stream = new FileStream(path, FileMode.Open);Image img = Image.FromStream(stream, false, false); //关键是将第三个参数设置为falseConsole.WriteLine('size: {0},{1}', img.Width, img.Height);jpeg批量转化工具

    用相机拍出来的原始jpeg图片是高保真质量, 所占文件体积非常大,本人写了一个批量转化的工具,可以将jpeg的质量都转化成80, 图像的宽高不变, 这时人眼几乎看不出有什么差别, 但其体积只有原来的1/3. 如果有大量的照片需要保存时, 节约的空间就很客观了。实现原理很简单, 就是读取jpeg文件, 然后再保存. 用c#实现的,代码量非常少,在此贴出全部源码1 class Program2 {3 static string src_path;4 static long small_size = 0;56 private static ImageCodecInfo GetCodecInfo(string mimeType)7 {8 ImageCodecInfo CodecInfo = ImageCodecInfo.GetImageEncoders;910 foreach (ImageCodecInfo ici in CodecInfo) {11 if (ici.MimeType == mimeType)12 return ici;13 }14 return null;15 }1617 static void SaveImage(string path)18 {19 FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read);2021 if (stream.Length == 0) {22 stream.Close;23 return;24 }2526 byte file_data = new byte[stream.Length];27 stream.Read(file_data, 0, (int)stream.Length);28 Stream mem = new MemoryStream(file_data);2930 long old_size = stream.Length;3132 try {33 Image img = new Bitmap(mem);34 stream.Close;3536 EncoderParameter p = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 80L);37 EncoderParameters ps = new EncoderParameters(1);3839 ps.Param[0] = p;4041 img.Save(path, GetCodecInfo('image/jpeg'), ps);4243 FileStream f = new FileStream(path, FileMode.Open, FileAccess.Read);44 long new_size = f.Length;45 f.Close;4647 small_size += old_size - new_size;4849 } catch (System.Exception ex) {5051 } finally {52 stream.Close;53 }5455 }5657 static void ConvertOneImage(string path, bool is_save)58 {59 if (is_save) {60 string new_name = src_path + path.Substring(path.LastIndexOf('\\'));61 File.Copy(path, new_name, true);62 }6364 SaveImage(path);65 }6667 static void ShowSize(string path)68 {69 FileStream stream = new FileStream(path, FileMode.Open);70 Image img = Image.FromStream(stream, false, false);71 stream.Close;72 //Console.WriteLine('{0} {1}', img.Width, img.Height);73 if (img.Width == 0) {74 Console.WriteLine('Error');75 }76 }7778 static void BatchJpeg79 {80 string path = Application.ExecutablePath;81 path = path.Substring(0, path.LastIndexOf('\\'));8283 src_path = path + '\\' + 'src';84 //Console.WriteLine(src_path);8586 Console.WriteLine('批量转化jpeg图片,保证其图片质量的前提下减少其存储大小');87 Console.WriteLine('若想保存原图片,其按y(原图将放在src文件夹下), 否则按任意键开始处理');8889 ConsoleKeyInfo key = Console.ReadKey;90 bool is_save = false;9192 if (key.KeyChar == 'y' || key.KeyChar == 'Y') {93 is_save = true;9495 Directory.CreateDirectory('src');96 }9798 string files = Directory.GetFiles(path, '*.jpg');99100 Stopwatch sw = new Stopwatch;101 sw.Start;102103 for (int i = 0; i < files.length;="" ++i)="" {104="" convertoneimage(files[i],="" is_save);105="" string="" s="files[i].Substring(files[i].LastIndexOf('\\')" +="" 1);106="" console.writeline((i="" +="" 1).tostring="" +="" '/'="" +="" files.length.tostring="" +="" '="" \t="" '="" +="" s);107108="" showsize(files[i]);109="" }110111="" sw.stop;112113="" console.writeline('*********已结束,按任意键结束********');114="" double="" v="(small_size" *="" 1.0="" (1024="" *="" 1024));115116="" console.writeline('共减少="" '="" +="" v.tostring('0.00##')="" +="" 'm="" 的存储空间');117="" console.writeline('耗时:'="" +="" sw.elapsed.totalseconds.tostring('0.00##')="" +="" '秒');118="" console.readkey;119="" }120121="" static="" void="" main(string[]="" args)122="" {123="" batchjpeg;124="" saveimage('e:\\img="" -="" 副本.jpg');125="" string="" path='E:\\cpp_app\\LiteTools\\JpegBatch\\bin\\Release\\img - 副本.JPG' ;126="" file.delete(path);127="" }128="">

    JpegBatchConvertExif信息

    另外jpeg文件一般有一个附属的exif信息,这个信息中有图像大小,拍摄时间,拍摄的相关参数,照片方向,图像缩略图等信息。

    用相机拍出来的jpeg都会有这个信息。如果照片方向不是正立的话,在读取到像素取后,还得按exif所指明的方向将图像旋转下。mspaint程序就没有做这个处理,有些图片用picasa查看和用mspaint查看方向就不一样。当然为了简单起见,上面的LBitmap中也自动忽略了exif信息及其图像拍摄时的方向。

    如果不用读取1/2,1/4,1/8的方法,也可以从exif中来读取缩略图,但这个缩略图一般很小。

    说到exif,不得不说一款用perl实现的命令行工具:exiftool。几乎所有的多媒体文件(图像、音乐、视频)都可以用这个工具来查看其有关信息,当然如果不是jpeg文件就是指广义上的'exif'。在git中有已经编译好可执行文件exiftool.exe。使用方法是将这个文件放到系统路径下,然后在想查看的文件路径下执行 exiftool filename

    在实现BatchJpeg工具时如果仅仅用上面实现的LBitmap来读取,保存, 将会失去exif信息, 而相片的拍摄时间等信息又很重要, 所以还得用另一个库exiv2来读取写入exif。如果用c#, 用上面的代码exif信息会自动保留下来。默默地向c#致敬。intelJpeg库

    如果在win32环境下对jpeg IO速度有很高的要求,可以使用interlJpeg库,不开源,但提供有*.h,*.lib文件。这个库可以大大提高jpg读取、保存速度。

    当时分别用c#和c实现了jpeg批量转化工具, 在处理大量图片时发现c#用时居然只有c的一半。太奇怪了,按理说,c的速度比c#应该快才对啊, 而实事是c慢了这么多。 最后发现问题就在libjpeg上,用了intetJpeg后速度就和c#差不多了(猜想.NET内部也是用intelJpeg来处理jpeg)。PNG格式png是一种无损压缩格式, 压缩大概是用行程编码算法。

    png可以有透明效果。

    png比较适合适量图,几何图。 比如本文中出现的这些图都是用png保存,比用joeg保存体积要小。

    再强调一下: jpeg比较适合存储色彩“杂乱”的拍摄图片,png比较适合存储方几何特征比较强的矢量图。

    png可能有24位图和32位图之分。32位图就是带有alpha通道的图片。

    将图片a绘制到另一幅图片b上,如果图片a没有alpha通道,那么就会完全将b图片的像素给替换掉。而如果有alpha通道,那么最后覆盖的结果值将是c = a*alpha + b*(1-alpha)

    再对LBitmap添加png的支持。

    添加接口如下:static bool ReadPngSize(const wchar_t *path, int *width, int *height);static bool IsPngFile(const wchar_t *filename);bool ReadPng(const wchar_t *filename);bool WritePng(const wchar_t *filename);

    具体实现在PngDemo中。有调用libpng库,并且libpng库依赖zlib库(由此可以看出png算法有用到常规的压缩算法)。GIF格式

    上面提到的bmp,jpeg,png图片都只有一帧,而gif可以保存多帧图像,如图所示

    68805914_7

    libgif库可以用来读取gif图片。gif中有个参数可以控制图片变化的快慢。在程序中可以使用这个参数,也可以自己定义一个参数,这就是为什么gif图片,在不同程序中查看时其变化速度不一样。webp

    google开发的一种有损、透明图片格式,相当于jpeg和png的合体,google声称其可以把图片大小减少40%。一个强大的格式库,CxImage

    CxImage几乎可以读取任何图片格式

    下面是其头文件中的宏定义:#define CXIMAGE_SUPPORT_WINDOWS 1#define CXIMAGE_SUPPORT_EXIF 1#define CXIMAGE_SUPPORT_BMP 1#define CXIMAGE_SUPPORT_GIF 1#define CXIMAGE_SUPPORT_JPG 1#define CXIMAGE_SUPPORT_PNG 1#define CXIMAGE_SUPPORT_ICO 1#define CXIMAGE_SUPPORT_TIF 1#define CXIMAGE_SUPPORT_TGA 1#define CXIMAGE_SUPPORT_PCX 1#define CXIMAGE_SUPPORT_WBMP 1#define CXIMAGE_SUPPORT_WMF 1#define CXIMAGE_SUPPORT_JP2 1#define CXIMAGE_SUPPORT_JPC 1#define CXIMAGE_SUPPORT_PGX 1#define CXIMAGE_SUPPORT_PNM 1#define CXIMAGE_SUPPORT_RAS 1#define CXIMAGE_SUPPORT_MNG 1#define CXIMAGE_SUPPORT_SKA 1#define CXIMAGE_SUPPORT_RAW 1#define CXIMAGE_SUPPORT_PSD 1

    CxImage在针对特定格式时,也是调用了其它图片库(比如libjpeg, libpng, libtiff)。由于CxImage太过庞大,如果不想使用其全部代码,可以自己从中“偷取”特定图片格式的读取、保存代码。

    展开全文
  • 下面我们先了解一下几种格式的比较正式的解释(注:以下内容源自百度知道):GIF意为GraphicsInterchangeformat(图形交换格式),GIF图片的扩展名是gif。现在所有的图形浏览器都支持GIF格式,而且有的图形浏览器只认识...

    下面我们先了解一下几种格式的比较正式的解释(注:以下内容源自百度知道):

    GIF 意为Graphics Interchange format(图形交换格式),GIF图片的扩展名是gif。现在所有的图形浏览器都支持GIF格式,而且有的图形浏览器只认识GIF格式。GIF是一种索引颜色格式,在颜色数很少的情况下,产生的文件极小,它的优点主要有:

    GIF格式支持背景透明。GIF图片如果背景色设置为透明,它将与浏览器背景相结合,生成非矩形的图片。

    GIF格式支持动画。在Flash动画出现之前,GIF动画可以说是网页中唯一的动画形式。GIF格式可以将单帧的图象组合起来,然后轮流播放每一帧而成为动画。虽然并不是所有的图形浏览器都支持GIF动画,但是最新的图形浏览器都已经支持GIF动画。

    GIF格式支持图形渐进。渐进是指图片渐渐显示在屏幕上,渐进图片将比非渐进图片更快地出现在屏幕上,可以让访问者更快地知道图片的概貌。

    GIF格式支持无损压缩。无损压缩是不损失图片细节而压缩图片的有效方法,由于GIF格式采用无损压缩,所以它更适合于线条、图标和图纸。

    GIF格式的缺点同样相当明显。索引颜色是历史遗留的产物,在DOS下的老游戏几乎无一例外的采用索引颜色,这种格式本来早就应该淘汰了。但是由于带宽的限制,GIF从DOS时代红到了Internet时代。GIF这种索引颜色格式最大的缺点就是它只有256种颜色,这对于照片质量的图片是显然不够的。

    JPEG 代表Joint Photograhic Experts Group(联合图像专家组),这种格式经常写成JPG,JPG图片的扩展名为jpg。

    JPG最主要的优点是能支持上百万种颜色,从而可以用来表现照片。此外,由于JPG图片使用更有效的有损压缩算法,从而使文件长度更小,下载时间更短。有损压缩会放弃图像中的某些细节,以减少文件长度。它的压缩比相当高,使用专门的JPG压缩工具其压缩比可达180:1,而且图像质量从浏览角度来讲质量受损不会太大,这样就大大方便了网络传输和磁盘交换文件。JPG较GIF更适合于照片,因为在照片中损失一些细节不像对艺术线条那么明显。另外,JPG对照片的压缩比例更大,而最后的质量也更好。

    但是从长远来看,JPG随着带宽的不断提高和存储介质的发展,它也应该是一种被淘汰的图片格式,因为有损压缩对图像会产生不可恢复的损失。所以经过压缩的JPG的图片一般不适合打印,在备份重要图片时也最好不要使用JPG。还有,JPG也不如GIF图像那么灵活,它不支持图形渐进、背景透明,更不支持动画。

    PNG 是20世纪90年代中期开始开发的图像文件存储格式,其目的是企图替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性。流式网络图形格式(Portable Network Graphic Format,PNG)名称来源于非官方的“PNG's Not GIF”,是一种位图文件(bitmap file)存储格式,读成“ping”。PNG用来存储灰度图像时,灰度图像的深度可多到16位,存储彩色图像时,彩色图像的深度可多到48位,并且还可存储多到16位的α通道数据。PNG使用从LZ77派生的无损数据压缩算法。

    PNG文件格式保留GIF文件格式的下列特性:

    使用彩色查找表或者叫做调色板可支持256种颜色的彩色图像。

    流式读/写性能(streamability):图像文件格式允许连续读出和写入图像数据

    这个特性很适合于在通信过程中生成和显示图像。

    逐次逼近显示(progressive display):这种特性可使在通信链路上传输图像文件的同时就在终端上显示图像,把整个轮廓显示出来之后逐步显示图像的细节,也就是先用低分辨率显示图像,然后逐步提高它的分辨率。

    透明性(transparency):这个性能可使图像中某些部分不显示出来,用来创建一些有特色的图像。

    辅助信息(ancillary information):这个特性可用来在图像文件中存储一些文本注释信息。

    独立于计算机软硬件环境。

    使用无损压缩。

    PNG文件格式中要增加下列GIF文件格式所没有的特性:

    每个像素为48位的真彩色图像。

    每个像素为16位的灰度图像。

    可为灰度图和真彩色图添加α通道。

    添加图像的γ信息。

    使用循环冗余码(cyclic redundancy code,CRC)检测损害的文件。

    加快图像显示的逐次逼近显示方式。

    标准的读/写工具包。

    可在一个文件中存储多幅图像。

    文件结构

    这三种格式各有优缺点,其中PNG优点多多。虽然普及得还很一般,但是其特殊的优越性已经让我们对其产生非常大的兴趣。至少我现在很喜欢这种格式。当然了对于制作页面的制作人员来说,页面总体积的大小那就是竞争力。所以我们还是必需要注意这三种格式的混合使用。那以什么时候用GIF什么时候用PNG什么时候用JPG呢?我们下面一一来分析。

    在实际的工作中,我发现一般的纯色的图形,比如一些小图标、平铺背景其中的色彩比较少,那么作为GIF格式虽然只有256种色彩,但是应对这种类型的图片那一定是非常的合适的。当然了,不排除有一些特别的小图标色彩的丰富性,但是相信作为小图标其色彩有点损失也不会影响到整体的视觉效果,所以GIF的适用范围是:小图标、平铺背景等色彩比较少的小型图片。

    那么大图片又怎么选择呢,首先我们先了解一下JPG,我们使用Photoshop的朋友都知道,在最后导出图片时会有一个地方让我们选择这个JPG图片的图片品质,100%是表示无压缩,当我们拿同一张图片导出不同的品质图片对比时我们发现品质低的很明显会比品质高的脏了很多,这样照片看起来就很不好,当然我们也发现这种情况在偏大色块的图片中犹为突出。所以比如天空、人像。特别人像面部就会出现很难看的黑斑。当然如果对于照片质量要求不严格可以使用JPG并且降低品质。但是不适用于背景、小图标。

    20080602200815659.png

    20080602200823768.png

    ccabb3a1a68355283b43c2e3b5ef15d0.png

    我个人觉得PNG是介于GIF与高品质JPG之间的一种选择,如果是简纯的小图标,PNG会比GIF大这么一点,但是品质上是差不多的。如果是普通的图片,那么PNG还是要比高品质的JPG要小一点的,但是PNG还是有点色彩损失的。不过如果图片不放大基本上看不出来。我们做页面基本上不是为了让人放大了挑刺。所以PNG也就是介于中间的一种选择。当然了,PNG还有一个很伟大的优点,那就是透明,虽然IE6之前还不支持这一特性。GIF也有透明,但是GIF只支持绝对的透明,不支持半透明,所以GIF的图片的边缘常会有一圈的白色的小点。而PNG就没有这些问题,随着时代的发展当IE6成为历史的时候我想我们就可以看到PNG的真实的威力。

    当然了有一种特别的情况可能会很特别,那就是背景图片与前景图片的切合处,这种地方需要色彩结构一致才能产生良好的视觉效果。那么这种时候注意尽可能的不要使用不同格式混合使用。

    展开全文
  • 常用图片格式介绍

    2021-10-28 09:35:53
    位图:像素点组成的图像,也是最常见的图像,放大后会失真,二次编辑会产生永久破坏性; 格式:jpg, png, bmp, tiff, gif等 矢量图:矢量图是使用直线和曲线来描述的,根据数学公式和几何特性生成的图形。矢量图...

    • 位图:像素点组成的图像,也是最常见的图像,放大后会失真,二次编辑会产生永久破坏性;

                      格式:jpg, png, bmp, tiff, gif等

    • 矢量图:矢量图是使用直线和曲线来描述的,根据数学公式和几何特性生成的图形。矢量图只能靠软件生成,特点是放大后图像不会失真,可二次编辑,适用于动画设计、文字设计和一些标志设计、版式设计等;

                      格式:svg, ai, cdr等

    JPEG 格式

    JPEG格式,也叫做JPG或JPE格式,是最常用的一种文件格式,Photoshop“存储为”命令中默认的图片格式就是JPG,大部分手机相机拍照的照片也是JPG格式。

     JPEG格式的压缩技术十分先进,能够将图像压缩在很小的储存空间,不过这种压缩是有损耗的,过度压缩会降低图片的质量。JPEG格式压缩的主要是高频信息,对色彩的信息保留较好,因此特别适合应用于互联网,可减少图像的传输和加载时间。

    PNG 格式

    PNG也是常见的一种图片格式,它最重要的特点是支持 alpha 通道透明度,也就是说,PNG图片支持透明背景。比如在使用Photoshop制作透明背景的logo时,如果使用JPG格式,则图片背景会默认地存为白色,使用PNG格式则可以存为透明背景图片。

    (在PhotoShop中,透明的背景表现为马赛克网格)

     PNG格式图片也支持有损耗压缩,虽然PNG 提供的压缩量比JPG少,但PNG图片却比JPEG图片有更小的文档尺寸,因此现在越来越多的网络图像开始采用PNG格式。

    GIF 格式

    GIF也是一种压缩的图片格式,分为动态GIF和静态GIF两种。

     GIF格式的最大特点是支持动态图片并且支持透明背景。网络上绝大部分动图、表情包都是GIF格式的,相比与动画,GIF动态图片占用的存储空间小,加载速度快,因此非常流行。

    TIFF 格式

    TIFF格式,也叫做或TIF格式,可以支持不同颜色模式、路径、透明度、以及通道,是打印文档中最常用的格式。Photoshop支持在TIFF文件中保存图层以及其他信息,在很多方面类似于PSD格式文件。

    BMP 格式

    BMP 格式是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。BMP格式包含的图像信息较丰富,几乎不进行压缩,但由此导致了它占用的存储空间很大,所以,目前BMP在单机上比较流行。 

    SVG 格式

    全称Scalable Vector Graphics,是无损的、矢量图。SVG跟上面这些图片格式最大的不同,是SVG是矢量图。当你放大一个SVG图片的时候,你看到的还是线和曲线,而不会出现像素点。这意味着SVG图片在放大时,不会失真,所以它非常适合用来绘制企业Logo、Icon等。

    SVG是很多种矢量图中的一种,它的特点是使用XML来描述图片。借助于前几年XML技术的流行,SVG也流行了很多。使用XML的优点是,任何时候你都可以把它当做一个文本文件来对待,也就是说,你可以非常方便的修改SVG图片,你所需要的只需要一个文本编辑器。

    在一般软件开发的过程中,若无特殊需求,总结为下:

    • 普通位图:保存为png格式
    • logo/图标:保存为svg格式
    展开全文
  • 从图片发展过程来看,AVIF(AV1 Image File Format,AV1图像文件格式)是目前最值得关注的新型图片格式。AVIF是业界最新的开源视频编码格式AV1的关键帧衍生而来的一种新的图像格式。AVIF由包括Google、Apple、...

    一、图片格式的发展

    二、AVIF介绍

    从图片发展过程来看,AVIF(AV1 Image File Format,AV1图像文件格式)是目前最值得关注的新型图片格式。AVIF是业界最新的开源视频编码格式AV1的关键帧衍生而来的一种新的图像格式。AVIF由包括Google、Apple、Netflix在内的开放媒体联盟(Alliance for Open Media,简称AOMedia)共同开发,并于2020年上半年由Netflix公布,作为JPEG的替代方案在Netflix的实际项目中落地。

    三、使用场景和其他图片格式对比

           Netflix的用户可以在包括手机、电视等多种流媒体设备上使用Netflix的服务,在这些设备类别上需要展示大量的高清晰度海报大图。所以,Netflix需要有一种在保持高清晰度,能极大地压缩体积的全新的图片格式。

     

           除了JPG之外,还有一些比较常见的图片格式,如 JPEG2000、WebP、HEVC。

    JPEG2000格式相比于 JPEG 有较大幅度的优化,但没有较好的市场推广,缺乏更加强大、大众化、商业化的软件生态支持,所以最终并没有很好地落地普及。

    WebP格式是基于VP8视频编码格式的帧内编码的图片格式,由 Google 于2010年在Android设备和Chrome浏览器率先落地支持并同步开源。目前来看,WebP主要是作为PNG更高效、更快的替代方案。

    HEVC(High-Efficiency Video Coding,高效视频编码)是H.264(又名高级视频编码,Advanced Video Coding,AVC)格式的后续格式,性能出色,常见于Apple设备中。从HEVC 帧内编码可以封装在高效图像文件格式(High-Efficiency Image File Format,HEIF),压缩效率高,但使用将要支付高额的专利费用。

    可视化对比

    下图为柯达数据集的原始源图像,无损PNG,700kb+。

    压缩后体积相似的情况下,JPEG和AVIF的清晰度进行对比。JPEG 编码在天空、池塘以及屋顶上显示出了非常明显的块状感,至少从观感上来说,体验是很糟糕的。但AVIF 编码表现得要好得多,虽然屋顶上还有一些模糊和纹理损失的现象,但整体清晰度还是完全可以接受的。考虑到压缩系数约为 59x(原始图像的尺寸为 768x512,因此需要 768x512x3 字节,而压缩后的图像为 20k 字节),所以最终的呈现效果还是很让人满意的。

    四、兼容性

    使用<picture>对不支持AVIF的浏览器版本做降级处理。

    目前主要是Chrome 85 +及少数浏览器版本能原生支持 AVIF。

     

    虽然原生支持的浏览器较少,但因为 AVIF 是开源的,在Web 中可以直接使用 JavaScript进行解析,所以有AVIF的Polyfill 项目去支持一些旧版本的浏览器。

    AVIF Polyfill项目地址:https://github.com/Kagami/avif.js

    优点:

    1. 体积小,可选依赖项,minified & gzip后小于4kb
    2. 方便,自动拦截AVIF fetch请求
    3. 快,如果浏览器支持,会使用本机解码器

    原生编码支持:

    1. Chrome Desktop 70+
    2. Firefox 63+ (media.av1.enabled需要激活)
    3. Firefox for Android 64+ (media.av1.enabled 和 media.av1.use-dav1d 需要激活)
    4. Edge 18+ (AV1 Video Extension需要安装)
    5. Bromite 71+

    使用AV1 polyfill:

    1. Chrome 57+
    2. Firefox 53+
    3. Edge 17+
    4. Safari 11+

    五、总结

    总结一下,AVIF有以下3个优点:

    1. 权威性,AVIF 由开源组织 AOMedia开发,Google、Netflix等企业均为该组织成员。

    2. 压缩性能高,相对比以往常见的图片格式,在相似体积大小的情况下,AVIF有更好的清晰度和呈现效果。

    3. 开源免费,并且可以通过JavaScript解析。

     

     

    展开全文
  • 【1】DICOM图像格式

    2021-04-29 18:54:21
    医学数字成像与通信(digital imaging and communicationsin medicine,DICOM)标准的制定和发展与图像存档与通信系统(picture archiving and communication systems,PACS)的发展有密切的关系。PACS在20世纪80...
  • TGA图片格式解析

    2021-03-24 15:40:20
    Week3_TGA图片格式解析 准备工作 1.下一个FlexHex工具用于以二进制方式打开文件 2.拿一张好看点的图片,先在ps里面打开, 再在“另存为“里面存储为TGA格式 TGA格式 TGA格式文件结构由五部分组成 1.文件头 由图像...
  • 记录一下图片格式转换 CogImage8Grey 转CMvdImage,ICogImage转CMvdImage同理 //图像转换工具 public class ImageConvetor { public CMvdImage toMvdImage(CogImage8Grey cogImage) { try {
  • 网页制作会用到的图片格式有: png-8 png-24 jpeg gif svg
  • 深度学习计算机视觉图像格式问题

    千次阅读 2021-11-08 15:46:17
    在传统cv中,涉及到颜色的任务有时会用hsv颜色模型。而在深度学习中全在用rgb,推测这一问题没有被深度学习领域的作者发现。 于是今天我做了实验,发现只是有轻微提升,可能是rgb映射到hsv早已被模型学到了。...
  • 【多选题】嵌入在HTML文档中的图像格式可以是( )。更多相关问题[单选] 直肠癌时,如在直肠周围脂肪组织中见到直径大于多少的软组织影应考虑有直肠周围肿大淋巴结。()[单选] 肝细胞癌CT表现,错误的是()[单选] 下面哪...
  • Mimics到底支持怎样的图像格式 What formats does Mimics supportJati这个问题的确是大家非常最关心的问题,下面结合我自己的经验,来抛砖引玉一下。Mimics支持三类图像格式:DICOM标准医学图像,一些常见的PC格式...
  • 一、各种格式介绍 1、ETC * ETC1+Alpha * 需要二次方,长宽可不一样 * ETC2格式需要 OpenGL ES 3.0以上才支持,在不支持的设备上, Unity 在运行时将纹理解压缩为ETC2 回退指定的格式 2、PVRTC * IOS...
  • 在Android程序开发过程中,明确哪些图像格式类(ImageFormat、PixelFormat及BitmapConfig等)及图像(JPG、PNG及BMP等)的转换方式非常重要,在以后的程序开发过程中会起到非常重要的作用。在一个项目开发过程中一款软件...
  • Basler相机获取与设置相机图片格式列表 1、获取所有的图片格式列表 2、从图片格式列表中选择一种图片格式进行设置图片格式
  • 图像格式总结

    2021-06-10 21:05:19
    本文主要讲一下常见的3种图像格式,RAW, RGB, YUV 目录: 1、RAW 2、RGB 3、YUV 3.1、yuv定义 3.2、采样格式 3.3、存储格式 1、RAW raw数据是sensor输出的原始数据,一般有raw8, raw10, raw12等,...
  • 最近,有位读者大人在后台反馈:在参加一场面试的时候,面试官要求他用 shader 实现图像格式 RGB 转 YUV ,他听了之后一脸懵,然后悻悻地对面试官说,他只用 shader 做过 YUV 转 RGB,不知道 RGB 转 YUV 是个什么...
  • 今天教大家一个实用的小技巧,用Python实现图片格式转化,即将PDF格式转化成PNG格式。整体代码:import fitz‘’’#将PDF转化为图片pdfPath pdf文件的路径imgPath 图像要保存的文件夹zoom_x x方向的缩放系数zoom_y y...
  • 设置图片格式 Sub setShapeStyle() ' 声明个内嵌图片(暂时没用到) Dim theShape As InlineShape ' 关闭屏幕更新 Application.ScreenUpdating = False For Each myShape In ActiveDocument.InlineShapes ...
  • 1 //bmp2jpg.cpp : 定义...2 //3 #include "stdafx.h"4 #include "jpeglib.h"5 #include "stdlib.h"6 #pragma comment(lib,"libjpeg.lib")7 #pragma pack(4) //两字节对齐,否则bmp_fileheader会占16Byte89 /*图像...
  • 并显式声明文件格式,例如:"type": "image/jpeg","name": "abc.jpg",'base64_encoded_data': "b64encoding_string"上传过程中服务器会根据图片的二进制头来验证格式,如果与type声明的格式不一致或者此格式(比如:...
  • Webp:WebP格式,谷歌(google)开发的一种旨在加快图片加载速度的图片格式。图片压缩体积大约只有JPEG的2/3,并能节省大量的服务器带宽资源和数据空间。Facebook Ebay等知名网站已经开始测试并使用WebP格式。 在...
  • 为AVIF文件格式开路 AVIF (AV1 Image File Format,AV1图像文件格式)是一种图片格式,用于将AV1压缩的图片或图片序列存储为HEIF文件格式。目前主流流媒体公司如 NETFLIX 和谷歌(谷歌浏览器)都支持这种格式,AVIF...
  • [css] 描述下你所了解的图片格式及使用场景 通常网页在显示的图片(图形)的时候,有以下几种格式:GIF、PNG、JPG、SVG,还有个比较新的WebP格式。 ▍GIF 优点:GIF是动态的;支持无损耗压缩和透明度。 缺点:的...
  • qrcode将生成的二维码转成图片格式

    千次阅读 2021-03-26 14:46:27
    微信里打开页面时需要长按识别二维码,所以需要转下图片 <div id="qrcode"></div> <img id="img"/> //默认使用Canvas生成,并显示到图片 var qrcode = $('#qrcode').qrcode('...
  • 之前一直做着和camera有关的工作,所以常常会涉及到图像格式的问题。感觉接触的名字和种类很多,索性好好整理一下,分个类,也方便后面再整理。 本文是自己记忆后复述的,可能用词不是特别准确。 1. 直接上结论 直接...
  • 常用的页面的图片格式有三种,GIF、JPG、PNG。GIF意为GraphicsInterchangeformat(图形交换格式);JPEG代表JointPhotograhicExpertsGroup(联合图像专家组),这种格式经常写成JPG,JPG图片的扩展名为jpg;流式网络图形...
  • 众所周知,一图胜千言,图片对于视觉的冲击效果远大于文字。...在不使用用户提供的图片时,最简单就可以使用 tinypng 网站针对各个图片进行图像压缩与优化。在减少了近 50% 大小的同时做到了肉眼无法区分,收益是
  • 常用的图像文件格式

    千次阅读 2021-07-27 00:13:36
    常用的图像文件格式介绍常用的图像文件格式图像的文件格式决定了图像数据的存储内容和存储方式,以及文件是否与一些应用程序兼容,另外还涉及到如何与其他程序交换数据等。我们现在来列举一些常用的图像文件格式,如...
  • 计算机图像显示原理与BMP图像的文件格式:一、计算机图像显示原理简述1.计算机图像分类:2.显示3.彩色图转灰白图原理二、BMP图像1.BMP/.JPG/.PNG2.组成(1)文件头(2)信息头(3)调色板(4)图像数据区 一、...
  • XnConvert 是一款简单易用的批量图像格式转换软件。你可以轻松的实现图像格式的转换、缩放图像比例、添加滤镜特效、水印等等。 XnConvert Mac版功能亮点 批量添加文件和文件夹 支持拖放文件 批量旋转,裁剪,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,149,765
精华内容 459,906
关键字:

图像格式