1、JPEG (jpg),文件头:FFD8FFE0或FFD8FFE1或FFD8FFE8。
2、GIF (gif),文件头:47494638PNG (png),文件头:89504E47。
3、TIFF (tif),文件头:49492A00。
4、Windows Bitmap (bmp),文件头:424DC001。
5、CAD (dwg),文件头:41433130。
6、Adobe Photoshop (psd),文件头:38425053。
7、Rich Text Format (rtf),文件头:7B5C727466。
8、XML (xml),文件头:3C3F786D6C。
9、HTML (html),文件头:68746D6C3E10。
10、Email [thorough only] (eml),文件头:44656C69766572792D646174653A。
11、Real Audio (ram),文件头:2E7261FD。
12、Real Media (rm),文件头:2E524D46。
13、MPEG (mpg),文件头:000001BA。
14、MPEG (mpg),文件头:000001B3。
15、Quicktime (mov),文件头:6D6F6F76。
16、Windows Media (asf),文件头:3026B2758E66CF11
参考资料来源:百度百科-文件头
PNG(Portable Network Graphics,便携式网络图形)是一种 无损压缩的位图图形格式 。它本身的设计目的是替代 GIF 格式,所以它与 GIF 有一些相似之处。
这一节我们来讨论 PNG 图片的数据结构, 一个 PNG 格式文件(或数据流)由一个 8 字节的签名和若干个数据块(chunk)组成。
PNG 文件头部的 8 字节为文件签名(或称魔数),这个值将被用来识别文件是否为 PNG 文件,数据固定为 8950 4E47 0D0A 1A0A 。以下是我任意打开的一个 PNG 文件:
PNG 定义了两种数据块: 关键数据块(critical chunks)&辅助数据块(ancillary chunks) 。
其中,关键数据块是从 PNG 数据流中成功解码图像所必需的,而辅助数据块是可选的,我们将重点了解关键数据块。关键数据块分为四种: 文件头数据块、调色板数据块、图像数据块和图像结束数据块。
PNG 的每一块数据块都由四个部分组成:
文件头数据块是 PNG 文件中的第一个数据块,包含了 PNG 文件的基本信息,由 13 个字节组成,数据结构如下:
调色板数据块包含有与索引彩色图像(indexed-color image)相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块 IDAT 之前。真彩色的 PNG 数据流也可以有调色板数据块,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。
图像数据块是图像实际存储的数据,可包含多个连续顺序的图像数据块。
图像结束数据块标记 PNG 文件或者数据流已经结束,必须要放在尾部。
通过查阅 《Protable Network Graphic (PNG) Specification (Second Edition)》 ,可以了解到 PNG 文件的编码过程主要分为五个阶段:
前两个步骤我看不懂,我直接讲后三个步骤。
这个步骤的主要思想是 增量编码 ,即:一个值可以表示为与前值的差值。
例如: 可以编码为 =>
可以发现,增量编码后的数据变成了大量重复、低值的数据,这样的数据是有利于压缩的,原因我在 第 3.4 节 说。
回到 PNG 的滤波步骤,这个步骤主要是选择合适的差分过滤器,分别处理每一行中的每个像素,使得差分编码的数值尽可能重复、尽可能小,要点如下:
在后面的 分块(chunking) 步骤中,会把编码过程中使用的滤波方法被记录 IHDR 中的 Filter method 字段里。
滤波是按通道而不是按像素进行的,也就是说滤波是先扫描一行中像素的红色通道,然后再扫描一行中像素的蓝色通道,以此类推。
PNG 的压缩过程结合了 LZ77 编码和 Huffman 编码,要点如下:
分块可方便地将压缩数据流分解为可管理的块,关于数据块的结构我们在 第 2 节 中讨论过。
在 第 3 节 编码原理 的讨论,我们提到了 增量编码 的概念,通过减少颜色的数量 &差异,滤波步骤之后数据的差异更小,有利于在压缩步骤中缩小文件。
不过,减少颜色的数量 &差异等同于给图片进行了有损编码,应当确保在高效压缩和图片质量之间保持适当的平衡。
如果图片的单色数量不超过 256 个,则可以采用 Indexed-colour(索引色) 格式。原始图像的每个像素由调色板中的一个索引表示。此时,每个像素的字节数由 3 字节(无透明通道)和 4 字节(有透明通道)减少到 1 字节,大大缩小文件。
如果图片的单色数量超过 256 个,就需要 采用矢量量化较少颜色数量,再生成索引色格式 。矢量量化就是将颜色相似的一块区域合并为同一种颜色的舍入的过程,主要分为以下步骤:
在 第 3 节 编码原理 中我们提到了 PNG 压缩是无损压缩,为了进一步提高压缩率,可以采用有损压缩算法,以下是现有的 PNG 有损压缩方案。
在官网介绍中,其实可以清楚地了解到它们的原理,主要就是采用了 第 4.3 节 讨论的方案:采用矢量量化较少颜色数量,再生成索引色格式。
官方地址: tinypng.com
局限:只提供了 HTTP 请求的方式,并且有次数限制。
官方地址: pngquant.org
Editting...
以下部分内容来自 百度百科 ,还会有一部分是自己的见解,我写这篇文章的目的是既让大家可以了解百度上已有的知识,但是不用再去找百度,还有就是可以看到我关于这种图片格式的深层次的了解,看完这篇,包括我在内,会感觉到即使很小很小的一个知识点,深入以后都是非常深的,底层和深层次原理是我的最爱,这也是我写博客的初衷和目的。GIF(Graphics Interchange Format) 的原义是“ 图像 互换格式”,是 CompuServe 公司在 1987年开发的 图像文件格式 。GIF文件的数据,是一种基于 LZW算法 的连续色调的无损 压缩格式 。其 压缩率 一般在 50% 左右,它不属于任何应用 程序 。GIF格式可以存多幅彩色图像,如果把存于一个文件中的多幅 图像数据 逐幅读出并显示到屏幕上,就可构成一种最简单的动画。 GIF图象是基于颜色列表的(存储的数据是该点的颜色对应于颜色列表的索引值),最多只支持8位(256色)。GIF文件内部分成许多存储块,用来存储多幅图象或者是决定图象表现行为的控制块,用以实现动画和交互式应用。GIF文件还通过LZW压缩算法压缩图象数据来减少图象尺寸。 GIF格式自1987年由 CompuServe 公司引入后,因其体积小、成像相对清晰,特别适合于初期慢速的 互联网 ,而大受欢迎。 在早期, GIF 所用的LZW压缩算法是Compuserv所开发的一种免费算法。然而令很多软件开发商感到意外的是,GIF文件所采用的压缩算法忽然成了 Unisys 公司的专利。 据Unisys公司称,他们已注册了 LZW算法 中的W部分。如果要开发生成(或显示)GIF文件的程序,则需向该公司支付版税。由此,人们开始寻求一种新技术,以减少开发成本。 PNG ( Portable Network Graphics ,便携网络图形)标准就在这个背景下应运而生了。它一方面满足了市场对更少的法规限制的需要,另一方面也带来了更少的技术上的限制,如颜色的数量等。 在2003年6月20日,LZW算法在美国的专利权已到期而失效。在欧洲、日本及加拿大的专利权亦已分别在2004年的6月18日、6月20日和7月7日到期失效。尽管如此,PNG文件格式凭着其技术上的优势,已然跻身于网络上第三广泛应用格式。与GIF相关的专利于2006年8月11日过期。 长久以来,iOS一直被吐槽不能用GIF。造成这一局面的主要原因是: GIF分为静态GIF和动画GIF两种,扩展名为.gif,是一种压缩 位图 格式,支持透明 背景图像 ,适用于多种 *** 作系统,“体型”很小,网上很多小动画都是GIF格式。其实GIF是将多幅图像保存为一个图像文件,从而形成动画,最常见的就是通过一帧帧的动画串联起来的搞笑gif图,所以归根到底GIF仍然是 图片文件格式 。 但GIF只能显示256色。和 jpg格式 一样,这是一种在网络上非常流行的图形文件格式。 GIF主要分为两个版本,即 GIF 89a 和 GIF 87a此给出的语法用来说明形成gif 数据流 的块序列,用一些规则列表来表达。下面列出用于gif语法的符号定义。 gif语法的符号定义:<GIF 数据流 >::= 头部 <;逻辑视屏><;数据>* 尾记录 gif 数据流 中的 数据块 可以分为三组:控制块、成象块和特殊用途块。 色表- gif格式利用色表来显示基于光栅的图像。色表分为全局色表和局部色表。全局色表对于那些没有设置局部色表的图像起作用。全局色表的作用域是整个 数据流 。局部色表对于紧接在其后的单张图像起作用。这两种色表都是可选的。 全局色表这东西是我们感兴趣的东西,它有点像png格式定义种的调色板,如果要修改gif图片的颜色,哈哈,修改这个全局色表就可以,如果有全局色表块,那么它一定从gif流的14个字节开始(头部6个 + 逻辑视频描述块7个)。 以下是各 数据块 的说明,如果注明为版本89a的话,则说明这个数据块不会在87a版的协议中出现。Packed Fields 说明: GIF文件内部是按块划分的,包括 控制块( Control Block ) 和 数据块(DataSub-blocks) 两种。控制块是控制数据块行为的,根据不同的控制块包含一些不同的控制参数;数据块只包含一些8-bit的字符流,由它前面的控制块来决定它的功能,每个数据块大小从0到255个字节,数据块的第一个字节指出这个数据块大小(字节数),计算数据块的大小时不包括这个字节,所以一个空的数据块有一个字节,那就是数据块的大小0x00。 下表是一个数据块的结构: 一个GIF文件的结构可分为文件头(File Header)、GIF数据流(GIF DataStream)和文件终结器(Trailer)三个部分。文件头包含GIF文件署名(Signature)和版本号(Version);GIF数据流由控制标识符、图象块(ImageBlock)和其他的一些扩展块组成;文件终结器只有一个值为0x3B的字符('''')表示文件结束。下表显示了一个GIF文件的组成结构: 是用来标识GIF署名(Signature)和版本号(Version)的。 GIF署名用来确认一个文件是否是GIF格式的文件,这一部分由三个字符组成:"GIF";文件版本号也是由三个字节组成,可以为"87a"或"89a"。具体如下图所示。 它包含了很多的部分。 (1) 逻辑屏幕标识符 (Logical Screen Descriptor) :这一部分由7个字节组成,定义了GIF图象的大小 (Logical Screen Width &Height) 、颜色深度 (Color Bits) 、背景色 (Blackground ColorIndex) 以及有无全局颜色列表 (Global Color Table) 和颜色列表的索引数 (IndexCount) ,具体描述见下图。 也可以参考下图。 (2)全局颜色列表 (Global Color Table) : 全局颜色列表必须紧跟在逻辑屏幕标识符后面,每个颜色列表索引条目由三个字节组成,按R、G、B的顺序排列。 (3)图象标识符 (Image Descriptor) :一个GIF文件内可以包含多幅图象,一幅图象结束之后紧接着下是一幅图象的标识符,图象标识符以0x2C('','')字符开始,定义紧接着它的图象的性质,包括图象相对于逻辑屏幕边界的偏移量、图象大小以及有无局部颜色列表和颜色列表大小,由10个字节组成,具体如下所示。 也可以参考下图。 (4)局部颜色列表 (Local Color Table) :如果上面的局部颜色列表标志置位的话,则需要在这里(紧跟在图象标识符之后)定义一个局部颜色列表以供紧接着它的图象使用,注意使用前应线保存原来的颜色列表,使用结束之后回复原来保存的全局颜色列表。如果一个GIF文件即没有提供全局颜色列表,也没有提供局部颜色列表,可以自己创建一个颜色列表,或使用系统的颜色列表。局部颜色列表的排列方式和全局颜色列表一样:RGBRGB...... (5) 基于颜色列表的图象数据 (Table-Based Image Data) :由两部分组成: LZW 编码长度 (LZW Minimum Code Size) 和图象数据 (Image Data) 。 下面给出总体的存储结构的原理图。 PC上制作软件主要为 Adobe ImageReady 和 fireworks 两个。 WEB上gif在线制作编辑 gif5.net ,支持 图片 、视频、FLASH转GIF。 我一般使用 LICEcap 制作gif图。1. 百度百科 2. GIF图片的文件储存结构和动画原理 3. GIF图片原理和储存结构深入解析欢迎分享,转载请注明来源:内存溢出
评论列表(0条)