android 图片格式,常见图片格式详解

本文深入探讨了常见的图片格式,包括BMP、JPEG、PNG和WebP的特点和用途。BMP是无损格式,但文件较大;JPEG适合照片,有损压缩;PNG支持透明,适用于图标;WebP是Google的压缩格式,可减少40%的文件大小。文章还介绍了各种格式的内部结构,如BMP的32位对齐、JPEG的不完全读取以及PNG的透明效果。
摘要由CSDN通过智能技术生成

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

常见的图片格式有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从文件开始处到像素数据的

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值