Android bitmap(二) 常见图片格式JPG PNG

PS基础教程:了解照片格式相关概念,入门教程,新手教程,我们可以使用不同的文件格式将图片导入和导出Photoshop,图片格式的不同之处表现在:表示照片信息的方式(作为像素还是矢量)、压缩照片数据的方式以及所支持的Photoshop的功能。

原文链接:移动端图片格式调研

参考
PNG、EPS、bmp、jpg等几种图片格式有什么区别
GIF/PNG/JPG和WEBP/base64/apng图片优点和缺点整理
移动端图片格式调研
Android 开发绕不过的坑:你的 Bitmap
究竟占多大内存

总的来说,有两大类截然不同的图像格式: 即有损压缩和无损压缩。

以下都是我对看此博客的一个总结或者是记录,仅仅用于自己观看,建议看到这篇文章的人还是去看下原文,更加详细和有说服力

一、有损压缩和无损压缩

1.有损压缩
有损压缩可以减少图像在内存和磁盘中占用的空间,在屏幕上观看图像时,不会发现它对图像的外观产生太大的不利影响。因为人的眼睛对光线比较敏感,光线对景物的作用比颜色的作用更为重要,这就是有损压缩技术的基本依据。有损压缩的特点是保持颜色的逐渐变化,删除图像中颜色的突然变化。生物学中的大量实验证明,人类大脑会利用与附近最接近的颜色来填补所丢失的颜色。例如,对于蓝色天空背景上的一朵白云,有损压缩的方法就是删除图像中景物边缘的某些颜色部分。当在屏幕上看这幅图时,大脑会利用在景物上看到的颜色填补所丢失的颜色部分。利用有损压缩技术,某些数据被有意地删除了,而被取消的数据也不再恢复。
无可否认,利用有损压缩技术可以大大地压缩文件的数据,但是会影响图像质量。如果使用了有损压缩的图像仅在屏幕上显示,可能对图像质量影响不太大,至少对于人类眼睛的识别程度来说区别不大。可是,如果要把一幅经过有损压缩技术处理的图像用高分辨率打印机打印出来,那么图像质量就会有明显的受损痕迹。
2.无损压缩
无损压缩的基本原理是相同的颜色信息只需保存一次。压缩图像的软件首先会确定图像中哪些区域是相同的,哪些是不同的。包括了重复数据的图像(如蓝天)就可以被压缩,只有蓝天的起始点和终结点需要被记录下来。但是蓝色可能还会有不同的深浅,天空有时也可能被树木、山峰或其他的对象掩盖,这些就需要另外记录。
从本质上看,无损压缩的方法可以删除一些重复数据,大大减少要在磁盘上保存的图像尺寸。但是,无损压缩的方法并不能减少图像的内存占用量,这是因为,当从磁盘上读取图像时,软件又会把丢失的像素用适当的颜色信息填充进来。如果要减少图像占用内存的容量,就必须使用有损压缩方法。
无损压缩方法的优点是能够比较好地保存图像的质量,但是相对来说这种方法的压缩率比较低。但是,如果需要把图像用高分辨率的打印机打印出来,最好还是使用无损压缩。几乎所有的图像文件都采用各自简化的格式名作为文件扩展名。从扩展名就可知道这幅图像是按什么格式存储的,应该用什么样的软件去读/写等等。

1.有损压缩
有损压缩可以减少图像在内存和磁盘中占用的空间,在屏幕上观看图像时,不会发现它对图像的外观产生太大的不利影响。因为人的眼睛对光线比较敏感,光线对景物的作用比颜色的作用更为重要,这就是有损压缩技术的基本依据。

文章主要针对几种不同格式的图片进行了编解码以及性能比较;

二、GIF

GIF(Graphics Interchange
Format)的原义是“图像互换格式”,是CompuServe公司在1987年开发的图像文件格式。GIF文件的数据,是一种基于LZW算法的连续色调的无损压缩格式。其压缩率一般在50%左右。
优点
  1.
优秀的压缩算法使其在一定程度上保证图像质量的同时将体积变得很小。
  2. 可插入多帧,从而实现动画效果。
  3. 可设置透明色以产生对象浮现于背景之上的效果。
缺点
  由于采用了8位压缩,最多只能处理256种颜色(2的8次方),故不宜应用于真彩图像。

有损压缩的特点是保持颜色的逐渐变化,删除图像中颜色的突然变化。生物学中的大量实验证明,人类大脑会利用与附近最接近的颜色来填补所丢失的颜色。例如,对于蓝色天空背景上的一朵白云,有损压缩的方法就是删除图像中景物边缘的某些颜色部分。当在屏幕上看这幅图时,大脑会利用在景物上看到的颜色填补所丢失的颜色部分。利用有损压缩技术,某些数据被有意地删除了,而被取消的数据也不再恢复。

静态图片格式介绍

  1. JPEG

    • 支持有损压缩,其压缩算法可以精确控制压缩比,以图像质量换得存储空间;
    • JPEG 编码中 quality
      越小,图片体积就越小,质量越也差,编码时间也越短。
    • 不同size的jpeg图片解码时间并没有很大的差距,可能是其大部分时间消耗在了函数调用、硬件调用上;编码时间则跟size成正相关;
    • 苹果在自己的相册 Demo 中提供的 quality 的默认值是
      0.9,在这个值附近,图像质量和体积、编码解码时间之间都能取得不错的平衡
    • 只支持有损压缩;
    • 许多移动设备的CPU都支持对此格式的硬编码和硬解码;
    • 图片细节不如PNG丰富;
  2. PNG

    • PNG 只支持无损压缩,所以它的压缩比是有上限的。相对于 JPEG 和 GIF
      来说,它最大的优势在于支持完整的透明通道;
    • PNG 相比 JPEG 标准更为清晰和简单;
    • 在编解码图形类型(颜色少、细节少)的图片时,PNG 和 JPEG
      差距并不大;但是对于照片类型(颜色和细节丰富)的图片来说,PNG
      在文件体积、编解码速度上都差 JPEG 不少了
  3. WebP

    • 支持有损和无损压缩、支持完整的透明通道、也支持多帧动画;
    • 对于简单的图形类型的图像(比如 App 内的各种 UI 素材),WebP
      无损压缩的文件体积和解码速度某些情况下已经比 PNG 还要理想了;
    • 对于复杂的图像(比如照片)来说,WebP
      无损编码表现并不好,但有损编码表现却非常棒。相近质量的图片解码速度
      WebP 相距 JPEG 也已经相差不大了,而文件压缩比却能提升不少;
  4. BPG

    • BPG 使用 HEVC (即 H.265)
      帧内编码作为其算法基础,就这点而言,它毋庸置疑是当下最为先进的图片压缩格式;
    • 相对于 JP2、JPEG-XR、WebP 来说,同等体积下 BPG
      能提供更高的图像质量
    • 得益于它本身基于视频编码算法的特性,它能以非常小的文件体积保存多帧动画
    • 有Javascript 版的解码器,任何浏览器只要加载了这个 76KB 大小的 JS
      文件,就可以直接显示 BPG 格式的图片;
    • 相同质量下,BPG 的解码速度还是差 JPEG 太多,大约慢了 3~5 倍;
三、PNG

便携式网络图片(Portable Network
Graphics),简称PNG,是一种无损数据压缩位图图形文件格式。PNG
诞生在1995年,比JPEG晚几年。它本身的设计目的是替代GIF格式,所以它与GIF
有更多相似的地方。PNG格式是无损数据压缩的,PNG格式有8位、24位、32位三种形式,其中8位PNG支持两种不同
的透明形式(索引透明和alpha透明),24位PNG不支持透明,32位 PNG
在24位基础上增加了8位透明通道(32-24===8),因此可展现256级透明程度。
  PNG这种类型的图片就是为了取代GIF图片而生的, 除了GIF不支持动画的优势,
能用PNG的地方就用PNG, 原因是压缩比高,色彩好;相对于 JPEG 和 GIF
来说,它最大的优势在于支持完整的透明通道。

优点
  支持256色调色板技术以产生小体积文件
  最高支持48位真彩色图像以及16位灰度图像。
  支持Alpha通道的半透明特性。
  支持图像亮度的gamma校正信息。
  支持存储附加文本信息,以保留图像名称、作者、版权、创作时间、注释等信息。
  使用无损压缩。
  渐近显示和流式读写,适合在网络传输中快速显示预览效果后再展示全貌。
  使用CRC循环冗余编码防止文件出错。
  最新的PNG标准允许在一个文件内存储多幅图像。
缺点
  但也有一些软件不能使用适合的预测,而造成过分臃肿的PNG文件。

无可否认,利用有损压缩技术可以大大地压缩文件的数据,但是会影响图像质量。如果使用了有损压缩的图像仅在屏幕上显示,可能对图像质量影响不太大,至少对于人类眼睛的识别程度来说区别不大。可是,如果要把一幅经过有损压缩技术处理的图像用高分辨率打印机打印出来,那么图像质量就会有明显的受损痕迹。

动态图片介绍

四、JPG/JPEG

JPEG是Joint Photographic Experts
Group(联合图像专家组)的缩写,文件后辍名为“.jpg”或“.jpeg”,是最常用的图像文件格式,它诞生于
1992
年,由一个软件开发联合会组织制定,是一种有损压缩格式,能够将图像压缩在很小的储存空间,图像中重复或不重要的资料会被丢失,因此容易造成图像数据的损伤。尤其是使用过高的压缩比例,将使最终解压缩后恢复的图像质量明显降低,如果追求高品质图像,不宜采用过高压缩比例。
JPG和JPEG没有区别,全名、正式扩展名是JPEG。但因DOS、Windows95等早期系统采用的8.3命名规则只支持最长3字符的扩展名,为了兼容采用了.jpg。也因历史习惯和兼容性考虑,.jpg目前更流行。
JPEG2000作为JPEG的升级版,其压缩率比JPEG高约30%左右,同时支持有损和无损压缩。JPEG2000格式有一个极其重要的特征在于它能实现渐进传输,即先传输图像的轮廓,然后逐步传输数据,不断提高图像质量,让图像由朦胧到清晰显示。此外,JPEG2000还支持所谓的“感兴趣区域”特性,可以任意指定影像上感兴趣区域的压缩质量,还可以选择指定的部分先解压缩。
JPEG2000和JPEG相比优势明显,且向下兼容,因此可取代传统的JPEG格式。
优点
  JPEG/JFIF是最普遍在万维网(World Wide
Web)上被用来储存和传输照片的格式。JPEG在色调及颜色平滑变化的相片或是写实绘画(painting)上可以达到它最佳的效果。在这种情况下,它通常比完全无失真方法作得更好,仍然可以产生非常好看的影像(事实上它会比其他一般的方法像是GIF产生更高品质的影像,因为GIF对于线条绘画(drawing)和图示的图形是无失真,但针对全彩影像则需要极困难的量化)。
缺点
  它并不适合于线条绘图(drawing)和其他文字或图示(iconic)的图形,因为它的压缩方法用在这些图形的型态上,会得到不适当的结果。给个活生生的例子:一张照片在Instagram反复上传下载90次之后,
在最后jpg图片完全变样了。
注意,jpg不支持透明度。

2.无损压缩

总体介绍
  1. 为了压缩文件体积,通常动图格式都支持一些特殊的方式对相似图片进行裁剪,只保留前后帧不同的部分;

  2. 在解码动图时,解码器通常采用所谓”画布模式”进行渲染。想象一下:播放的区域是一张画布,第一帧播放前先把画布清空,然后完整的绘制上第一帧图;播放第二帧时,不再清空画布,而是只把和第一帧不同的区域覆盖到画布上,就像油画的创作那样;

  3. 像这样的第一帧就被称为关键帧(即 I
    帧,帧内编码帧),而后续的那些通过补偿计算得到的帧被称为预测编码帧(P帧)。一个压缩的比较好的动图内,通常只有少量的关键帧,而其余都是预测编码帧;一个较差的压缩工具制作的动图内,则基本都是关键帧。不同的动图压缩工具通常能得到不同的结果;

  4. 动图格式通常有更为详细的参数控制每一帧的绘制过程,比如清除方式,混合模式;

  1. GIF

    • 它通常只支持 256
      色索引颜色,这导致它只能通过抖动、差值等方式模拟较多丰富的颜色;它的
      Alpha 通道只有 1
      bit,这意味着一个像素只能是完全透明或者完全不透明(可能出现毛边问题);
    • GIF图表现其实非常差,但是你可以用ffmpeg去优化GIF,可以看下这篇文章使用
      FFmpeg 处理高质量 GIF
      图片;
    • 支持多帧动画,流行比较久;
  2. APNG

    • 它实际上只是相当于 PNG 格式的一个扩展;
    • APNG 是 GIF
      最好的替代了:实现简单,可用范围广,压缩比不错,显示效果好;
    • APNG 在文件体积上比 GIF 略有优势,解码时间相差不多
  3. WebP

    • WebP 动图实际上是把多个单帧 WebP
      数据简单打包到一个文件内,而并不是由单帧 WebP
      扩展而来,以至于动图格式并不能向上兼容静态图;
    • 如果要支持动图,首先在编译 libwebp 时需要加上 demux 模块,解码
      WebP 时需要先用 WebPDemuxer 尝试拆包,之后再把拆出来的单帧用
      WebPDecode 解码;
    • WebP 在体积和解码时间上都具有较大的优势;
  4. BPG

    • BPG 本身是基于 HEVC (H.265)
      视频编码的,其最开始设计时就考虑到了动图的实现;
    • 由于它充分利用了 HEVC
      的高压缩比和视频编码的特性,其动图压缩比远超其他格式;
    • BPG 在体积上优势最大,但解码时间也最长

最后还少帮YY打个其实不需要打的广告了:

如果你是 iOS 平台的开发者,可以试试我开发的 YYWebImage,它支持
APNG、WebP、GIF
动图的异步加载与播放、编码与解码,支持渐进式图像加载,可以替代
SDWebImage、PINRemoteImage、FLAnimatedImage 等开源库。

五、WebP

WebP 是 Google 在 2010 年发布的图片格式,希望以更高的压缩比替代
JPEG。它用 VP8
视频帧内编码作为其算法基础,取得了不错的压缩效果。它支持有损和无损压缩、支持完整的透明通道、也支持多帧动画,并且没有版权问题,是一种非常理想的图片格式。借由
Google 在网络世界的影响力,WebP
在几年的时间内已经得到了广泛的应用。看看你手机里的
App:微博、微信、QQ、淘宝、网易新闻等等,每个 App 里都有 WebP
的身影。Facebook 则更进一步,用 WebP 来显示聊天界面的贴纸动画。
IE暂不支持,具体参考WebP
浏览器支持

无损压缩的基本原理是相同的颜色信息只需保存一次。压缩图像的软件首先会确定图像中哪些区域是相同的,哪些是不同的。包括了重复数据的图像(如蓝天)就可以被压缩,只有蓝天的起始点和终结点需要被记录下来。但是蓝色可能还会有不同的深浅,天空有时也可能被树木、山峰或其他的对象掩盖,这些就需要另外记录。从本质上看,无损压缩的方法可以删除一些重复数据,大大减少要在磁盘上保存的图像尺寸。但是,无损压缩的方法并不能减少图像的内存占用量,这是因为,当从磁盘上读取图像时,软件又会把丢失的像素用适当的颜色信息填充进来。如果要减少图像占用内存的容量,就必须使用有损压缩方法。

补充:有损压缩和无损压缩

常用图片格式介绍总的来说,有两种截然不同的图像格式类型:
即有损压缩和无损压缩。

  1. 有损压缩
    有损压缩可以减少图像在内存和磁盘中占用的空间,在屏幕上观看图像时,不会发现它对图像的外观产生太大的不利影响。因为人的眼睛对光线比较敏感,光线对景物的作用比颜色的作用更为重要,这就是有损压缩技术的基本依据。
    有损压缩的特点是保持颜色的逐渐变化,删除图像中颜色的突然变化。生物学中的大量实验证明,人类大脑会利用与附近最接近的颜色来填补所丢失的颜色。例如,对于蓝色天空背景上的一朵白云,有损压缩的方法就是删除图像中景物边缘的某些颜色部分。当在·屏幕上看这幅图时,大脑会利用在景物上看到的颜色填补所丢失的颜色部分。利用有损压缩技术,某些数据被有意地删除了,而被取消的数据也不再恢复。
    无可否认,利用有损压缩技术可以大大地压缩文件的数据,但是会影响图像质量。如果使用了有损压缩的图像仅在屏幕上显示,可能对图像质量影响不太大,至少对于人类眼睛的识别程度来说区别不大。可是,如果要把一幅经过有损压缩技术处理的图像用高分辨率打印机打印出来,那么图像质量就会有明显的受损痕迹。

  2. 无损压缩
    无损压缩的基本原理是相同的颜色信息只需保存一次。压缩图像的软件首先会确定图像中哪些区域是相同的,哪些是不同的。包括了重复数据的图像(如蓝天)就可以被压缩,只有蓝天的起始点和终结点需要被记录下来。但是蓝色可能还会有不同的深浅,天空有时也可能被树木、山峰或其他的对象掩盖,这些就需要另外记录。从本质上看,无损压缩的方法可以删除一些重复数据,大大减少要在磁盘上保存的图像尺寸。但是,无损压缩的方法并不能减少图像的内存占用量,这是因为,当从磁盘上读取图像时,软件又会把丢失的像素用适当的颜色信息填充进来。如果要减少图像占用内存的容量,就必须使用有损压缩方法。
    无损压缩方法的优点是能够比较好地保存图像的质量,但是相对来说这种方法的压缩率比较低。但是,如果需要把图像用高分辨率的打印机打印出来,最好还是使用无损压缩几乎所有的图像文件都采用各自简化的格式名作为文件扩展名。

结论

  1. 有损压缩将图片的某些数据直接删除,不可恢复;无损压缩将图片中的重复数据删除;
  2. 有损压缩和无损压缩都可以减少图片在磁盘中的开销;
  3. 有损压缩由于删除的数据不可恢复,那么当图片加载进内存时,图片占用的内存会在原图上减少很多;但是无损压缩的图片加载进内存时,被删除的重复的数据会被用适当的颜色信息填充进来,因此内存开销并不会有明显变化;
六、移动端图片类型的支持情况

Android 的图片编码解码是由 Skia 图形库负责的,Skia
通过挂接第三方开源库实现了常见的图片格式的编解码支持。目前来说,Android
原生支持的格式只有 JPEG、PNG、GIF、BMP 和 WebP (Android 4.0
加入),在上层能直接调用的编码方式也只有 JPEG、PNG、WebP 这三种。目前来说
Android 还不支持直接的动图编解码。

发表评论

电子邮件地址不会被公开。 必填项已用*标注