⑴ PNG、JPEG、BMP等几种图片格式详解(四)—— GIF
以下部分内容来自 网络 ,还会有一部分是自己的见解,我写这篇文章的目的是既让大家可以了解网络上已有的知识,但是不用再去找网络,还有就是可以看到我关于这种图片格式的深层次的了解,看完这篇,包括我在内,会感觉到即使很小很小的一个知识点,深入以后都是非常深的,底层和深层次原理是我的最爱,这也是我写博客的初衷和目的。
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图片原理和储存结构深入解析
⑵ gif是二进制文件吗
经验分享
GIF图片原理和储存结构深入解析
落木-肖
原创
关注
0点赞·664人阅读
GIF是一种使用LZW压缩,支持多张图像的容器。支持256色,透明通道为1bit。作为互联网表情包的载体,GIF这项80年代的技术依然生生不息。
但它的弊端也是显而易见的:易出现毛边,色彩表现低劣,文件压缩比不高。针对这些问题,Mozilla发布了APNG来代替老旧的GIF技术,同时许多开源组件也用WebP格式来代替GIF。
GIF在iOS的尴尬处境
长久以来,iOS一直被吐槽不能用GIF。造成这一局面的主要原因是:
iOS关于照片的场景不会自动播放GIF,也没有角标。
一些应用将GIF视为静态图像去操作,导致用户保持了一个GIF后,结果应用将其保存成JPG。
iOS只能通过imageI/O去操作GIF数据,UIKit对其绝缘。
GIF的存储结构
由于历史的原因,GIF有两个版本,但它们的文件结构是一样的,都是由不同用途的数据块构成,可分为控制块和数据块。控制块里是决定GIF表现的参数,数据块里的数据由前面的控制块里的参数来解释。
一个GIF文件的内部结构如下图:
GIF结构
Header:包含文件签名与版本号。
Trailer: 文件结束标识符。
GIF Data: Header 与 trailer 之间就是GIF文件的数据。
我们从一个简单的GIF图入手,它包含两张图像:
这是它的十六进制数据,我用颜色区分了不同的数据块:
Paste_Image.png
Header
GIF文件的开头是 Header 数据块,长度为6字节,ASCII值为“GIF87a”或”GIF89a”,前三位为GIF签名,后三位为不同年份的版本号。
Paste_Image.png
利用这点,在iOS中判断二进制文件是否为GIF时,可以简单去判断它的前四位是否是”GIF8″。事实上绝大多数图像都可以用文件签名来判断类型。
GIF 内容
GIF数据包含多个数据块,其结构如下:
逻辑屏幕描述符
0A000A00 B30000
这一数据块由7个字节组成,前四个字节分别是图像渲染区域的宽高。GIF的数据是按照大端序存储的,0x0A00为10,所以这个GIF的宽高均为10。
接下来是一个压缩字节,第一个 Bit 为标志位,表示全局颜色列表是否存在。接下来三个Bit表示图像调色板中每个颜色的原色所占用的Bit数,011表示占用4个Bit,111占用8个Bit,以此类推。调色板最多只包含由24-Bit颜色中选出的256个颜色(实际有很多优化方案能提高颜色分辨率,如加入局部调色板)。第五个Bit为标志位,表示颜色列表排序方式。若为1,表示颜色列表是按照颜色在图像中出现的频率降序排列。随后三个Bit表示全局颜色列表的大小,计算方法是2^N+1 ,其中N为这三个Bit的二进制数值。
第六个字节是表示背景色在全局颜色列表中的索引,若无全局颜色列表则此字节无效。在GIF的图像数据中,没有被指定颜色的像素会被背景色填充。
最后一个字节是像素的宽高比,大多数时候这个值都是0,若值为N, 则图像的宽高比:
aspectRatio = (pixelAspectRatio + 15) / 64
全局颜色列表
000000 80000000 80008080 00000080 80008000 8080C0C0 C0808080 FF000000 FF00FFFF 000000FF FF00FF00 FFFFFFFF FF
由前面的逻辑屏幕描述符可知,全局颜色列表的大小是16,每个颜色占三个字节,按照RGB排列,所以它占有48个字节。数据流中,颜色是按照列表中的索引存储的。
应用程序扩展
>
x
GIF中扩展块都以0x21开始,后一个字节是扩展标签,标识扩展用途。
应用程序扩展的标签是0xFF,它包含有应用程序的标识信息和应用程序数据。其中 Netscape 应用程序扩展常用于控制GIF的动画循环次数。Netscape 扩展长19个字节,前14个是应用程序的ACSII信息,后四个是数据子块,用于指定GIF的循环次数, 按无符号整型存储,0表示无限循环。
图形控制扩展
21F90409 32000F00
图形控制扩展块属于”89a”版本的定义。它在一个图像数据块的最前端,用来指定图像的透明度与动画属性。图形控制扩展的开端两字节是0x21F9,其中0x21表示这是一个扩展,F9表示扩展用于图形控制。第三个字节是块大小(它到结束符之间的数据)。第四个字节是压缩字段,前三个Bit保留,四到六Bit是disposal method。第四、五个字节是图像控制扩展后面的图像的动画时间,以无符号整型存储。第六个字节是透明色索引,之后是块结束符0x00。
图像描述符
2C000000 000A000A 0000
图像描述符位于GIF中每一个图像数据的前端,由0x2C开始,长度为10个字节。第一个字节是图像描述符的标识0x2c,后面八个字节表示图像的frame(left, top, width, height),用来在动画中局部更新图像。最后一个是压缩字节,主要是关于局部颜色列表的信息,其中第二个Bit表示图像的存储方式是交织还是连续。
局部颜色列表
如果上面的局部颜色列表标志位为1,那么局部颜色列表会排列在图像描述符后面,它只对紧跟在它之后的图像数据有效。如果局部颜色列表标志位为0,那么图像数据将使用全局颜色列表索引颜色。局部颜色列表的大小计算方法和像素颜色格式与全局颜色列表相同。
图像数据
041C 1080472B 0549DA9B BAAE58E7 4D4F288E E629A519 697E1C0C 92DB1301 00
GIF的图像数据是经过LZW压缩的二进制流,通过解码可以将其按照颜色列表中的颜色进行像素填充。第一个字节是LZW最小编码大小,用来进行数据解码。第二个字节是图像数据的大小,之后的都是图像数据,直到块结束符。
结束符
3B
GIF的动画原理
GIF动画的循环次数是由应用扩展来控制的,而GIF动画每一帧的过渡方式是由图形控制扩展控制,图像描述符控制图像绘制的区域。
图形控制扩展中控制动画的参数分别是:disposal method,user input flag,delay time,transparency color。
disposal method
disposal method占3Bit,能够表示0-7。
disposal method = 1
解码器不会清理画布,直接将下一幅图像渲染上一幅图像上。
disposal method = 2
解码器会以背景色清理画布,然后渲染下一幅图像。背景色在逻辑屏幕描述符中设置。
disposal method = 3
解码器会将画布设置为上之前的状态,然后渲染下一幅图像。
disposal method = 4-7
保留值
user input flag
当user input flag为1时,GIF会在有用户输入事件(鼠标、键盘)时才会过渡到下一幅图像。
delay time
delay time占两个字节,为无符号整数,控制当前帧的展示时间,单位是0.01秒。
transparency color
如果图形控制扩展的透明色标志位为1,那么解码器会通过透明色索引在颜色列表中找到改颜色,标记为透明,当渲染图像时,标记为透明色的颜色将不会绘制,显示下面的背景。
图像渲染区域
GIF中图像描述符指定了当前帧需要渲染的区域,这样GIF的过渡动画就只用绘制两帧之间不同的区域,前提是diposal method的值为1。
实验
根据上面的知识,将第一帧的图形控制扩展改为:
21F90409 0A000900
这里将透明色改成了红色(红色在全局颜色列表中的索引是9),并将delay time改为0.1秒。修改完的GIF为:
⑶ PS GIF文件格式中说的支持一级透明是什么意思
GIF格式是CompuServe提供的一种图形格式,只是保存最多256色的RGB色阶阶数,它使用LZW压缩方式将文件压缩而不会占磁盘空间,因此GIF格式广泛应用于因特网HTML网页文档中,或网络上的图片传输,但只能支持8位的图像文件。 在保存GIF格式之前,必需将图片格式转换为位图,灰阶或索引色等颜色模式,GIF格式采用两种保存格式,一种为CompuServe GIF格式,可以支持Interlace(交错的)保存格式,让图像在网络上显示时是由模糊逐渐转换为清晰的效果。另一种格式为GIF 89a Export,除了支持Ibterlace(交错的)特性外,还可以支持透明背景及动画格式,它只支持一个Alpha通道的图像信息。
希望采纳
⑷ BMP、GIF、TIFF、PNG、JPG和SVG格式图像的特点
一张图片可以储存为多种格式,为什么有的几十KB,有的几百MB,有的静止不动,有的是好几个画面循环播放?在项目开发的过程中经常会读取或保存图像文件,不同类型的图像特点不同,适用的范围也不同,简要介绍BMP、GIF、TIFF、PNG、JPG和SVG格式图像的特点。
BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。随着Windows操作系统的流行与丰富的Windows应用程序的开发,BMP位图格式理所当然地被广泛应用。这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,但由此导致了它与生俱生来的缺点是占用磁盘空间过大。所以,目前BMP在单机上比较流行。
BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图象处理软件都支持BMP图象文件格式。Windows系统内部各图像绘制操作都是以BMP为基础的。BMP位图文件默认的文件拓展名是BMP或者bmp(有时它也会以.DIB或.RLE作扩展名)
虽然同时支持索引色和直接色是一个优点,但是太大的文件格式格式导致它几乎没有用武之地,现在除了在Windows操作系统中还比较常见之外,我们几乎看不到它。在同样的图片质量下,BMP格式的图片文件大小是GIF格式的很多倍。
GIF是Graphics Interchange Format的简写,它是图形转换格式,采用LZW压缩算法进行编码,用于以超文本标志语言(Hypertext Markup Language)方式显示索引彩色图像,在因特网和其他在线服务系统上得到广泛应用。GIF是一种公用的图像文件格式标准,版权归Compu Serve公司所有。
GIF是无损的,采用GIF格式保存图片不会降低图片质量。但得益于数据的压缩,GIF格式的图片,其文件大小要远小于BMP格式的图片。文件小,是GIF格式的优点,同时,GIF格式还具有支持动画以及透明的优点。但是GIF格式仅支持8Bit的索引色,即在整个图片中,只能存在256种不同的颜色。
GIF可以被PC和Mactiontosh等多种平台上被支持,适用于对色彩要求不高同时需要文件体积较小的场景,比如企业Logo、线框类的图等。很多人以为GIF指的就是动图,其实GIF不仅有动画GIF,还有静态GIF,因其体积小的特点,现在GIF被广泛的应用在各类网站中。
TIFF是Tag Image File Format的简写,它是标签图像文件格式,TIFF(Tag Image File Format)图像文件是图形图像处理中常用的格式之一,其图像格式很复杂,但由于它对图像信息的存放灵活多变,可以支持很多色彩系统,而且独立于操作系统,因此得到了广泛应用(拓展性支持Mac跟Windows系统交叉使用)。在各种地理信息系统、摄影测量与遥感等应用中,要求图像具有地理编码信息,例如图像所在的坐标系、比例尺、图像上点的坐标、经纬度、长度单位及角度单位等。
PNG是Portable Network Graphics的简写,它是便携式网络图形,PNG是一种无损压缩的位图片形格式,其设计目的是试图替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性。PNG压缩比高,生成文件体积小,PNG结合了GIF和TIFF优点,能够支持压缩不失真、透明背景、渐变图像的制作要求,现在广泛应用于PS软件以及互联网之中。
PNG格式有8位、24位、32位三种形式,其中8位PNG支持两种不同的透明形式(索引透明和alpha透明),24位PNG不支持透明,32位PNG在24位基础上增加了8位透明通道,因此可展现256级透明程度。
JPG是JPEG(Joint Photographic Experts Group)的简写,它是一种比较常见的图画格式。它的特点是压缩比高,生成文件体积小。
JPEG格式是目前网络上最流行的图像格式,是可以把文件压缩到最小的格式,JPG图片格式的设计目标,是在不影响人类可分辨的图片质量的前提下,尽可能的压缩文件大小。这意味着JPG去掉了一部分图片的原始信息,也即是进行了有损压缩。JPG的图片的优点,是采用了直接色,得益于更丰富的色彩,JPG非常适合用来存储照片,用来表达更生动的图像效果,比如颜色渐变。
不过它的缺点也很明显,编辑和重新保存 JPG 文件时,JPG 会混合原始图片数据的质量下降,而且这种下降是累积性的。打个比方,你在微信里面收到被转发很多次的JPG图片会发现图片比原图模糊许多,且泛绿色。
SVG是Scalable Vector Graphics的简写,它是可缩放矢量图形,SVG图片由直线和曲线以及绘制它们的方法组成。当你放大一个SVG图片的时候,你看到的还是线和曲线,而不会出现像素点。这意味着SVG图片在放大时,不会失真,所以它非常适合用来绘制企业Logo、Icon等。
SVG作为W3C所推荐的基于XML的开放标准,能够与其他网络技术进行无缝集成,特点是使用XML来描述图片。借助于前几年XML技术的流行,SVG也流行了很多。使用XML的优点是,任何时候你都可以把它当做一个文本文件来对待,也就是说,你可以非常方便的修改SVG图片,你所需要的只需要一个文本编辑器。
每种类型图像都有不同的指标特点,总结如下:
图片文件格式有可能会对图片的文件大小进行不同程度的压缩,图片的压缩分为有损压缩和无损压缩两种。
有损压缩。指在压缩文件大小的过程中,损失了一部分图片的信息,也即降低了图片的质量,并且这种损失是不可逆的,我们不可能从有一个有损压缩过的图片中恢复出全来的图片。常见的有损压缩手段,是按照一定的算法将临近的像素点进行合并。
无损压缩。只在压缩文件大小的过程中,图片的质量没有任何损耗。我们任何时候都可以从无损压缩过的图片中恢复出原来的信息。
计算机在表示颜色的时候,有两种形式,一种称作索引颜色( Index Color ),一种称作直接颜色( Direct Color )。
索引色。用一个数字来代表(索引)一种颜色,在存储图片的时候,存储一个数字的组合,同时存储数字到图片颜色的映射。这种方式只能存储有限种颜色,通常是256种颜色,对应到计算机系统中,使用一个字节的数字来索引一种颜色。
直接色。使用四个数字来代表一种颜色,这四个数字分别代表这个颜色中红色、绿色、蓝色以及透明度。现在流行的显示设备可以在这四个维度分别支持256种变化,所以直接色可以表示2的32次方种颜色。当然并非所有的直接色都支持这么多种,为压缩空间使用,有可能只有表达红、绿、蓝的三个数字,每个数字也可能不支持256种变化之多。
点阵图,也叫做位图,像素图。构成点阵图的最小单位是象素,位图就是由象素阵列的排列来实现其显示效果的,每个象素有自己的颜色信息,在对位图图像进行编辑操作的时候,可操作的对象是每个象素,我们可以改变图像的色相、饱和度、明度,从而改变图像的显示效果。点阵图缩放会失真,用最近非常流行的沙画来比喻最恰当不过,当你从远处看的时候,画面细腻多彩,但是当你靠的非常近的时候,你就能看到组成画面的每粒沙子以及每个沙粒的颜色。
矢量图,也叫做向量图。矢量图并不纪录画面上每一点的信息,而是纪录了元素形状及颜色的算法,当你打开一付矢量图的时候,软件对图形象对应的函数进行运算,将运算结果[图形的形状和颜色]显示给你看。无论显示画面是大还是小,画面上的对象对应的算法是不变的,所以,即使对画面进行倍数相当大的缩放,其显示效果仍然相同(不失真)。
图片的压缩方式有无损压缩和有损压缩两种。前者压缩后比后者要大。
1、图片的颜色表示有直接颜色和索引颜色两种。前者比后者更丰富,体积更大。
2、BMP采用无损压缩和直接色,所以体积最大。太大的文件格式格式导致它几乎没有用武之地。
3、GIF采用无损和索引色的,适用于对色彩要求不高同时需要文件体积较小的场景,比如企业Logo、线框类的图等。支持动画和透明。
4、JPEG(JPG)采用有损压缩和直接色,不适合用来存储企业Logo、线框类的图。因为有损压缩会导致图片模糊,而直接色的选用,又会导致图片文件较GIF更大。而适合作为摄影类的图片。.
所以小图片尽量使用png、要想支持动画则使用gif、大型图片使用jpg。
⑸ 为什么用PS打开的GIF格式的图片都变成索引模式没有图层了呢
那得看看Photoshop 的是啥版本,Photoshop CS2 到Photoshop CS4是不能直接打开gif动画,只能用导入视频帧到图层的功能强行把gif当做视频来导入才能出现gif图层。只有到了Photoshop CS5才能完美打开gif动画帧。同时顺便说说之前的版本导入和Photoshop CS5打开后图层有什么区别,到图的话就不能在保存原有gif的透明像素,就是说一张背景透明的gif动画导入后的图层的所有透明像素都没用颜色填充,失去透明效果。Photoshop CS5打开的话就能完美保存gif原有的透明像素,做多张gif叠加的时候这个就很重要。
⑹ Gif索引透明色,可以指定多个颜色吗
GIF有颜色的地方,是不透明的,没颜色的地方是透明的,而且是全透明的,不像PNG半透明,所以只有一个透明色。