图像和视频的主要格式编码格式。
图像格式
图像的基本数据结构:RGB,RGBA,A为透明通道。图像是⼆维数据,数据在内存中只能⼀维存储,⼆维转⼀维有不同的对应⽅式。⽐较常见的只有两种⽅式: 按像素“⾏排列”从上往下或者从下往上。
不过好像只有bmp图⽚格式以及windows下的GDI,GDI+是从下往上排列,其它⽐如DirectX,OpenGL,Cocoa(NSImage,
UIImage),OpenCV等都是从上往下排列。
不同图形库中每个像素点中RGBA的排序顺序可能不⼀样。有可能是RGB,RBG等六种情况。如果是RGB24位图,会存在⼀个32位对齐的问题,也就是内存对齐。先介绍x86是⼀个intel系列的标准编号缩写,也标识⼀套通⽤的集合,X与处理器没有任何关系,它是⼀个对所有*86系统的简单的定义。cpu的位是指⼀次性可处理的数据量是多少,1字节=8位,可以⼀次性处理4个字节的数据量,依次类推。在x86体系下,cpu⼀次处理32整数倍的数据会更快,图像处理中经常会按⾏为单位来处理像素。24位图,宽度不是4的倍数时,其⾏字节数将不是32整数倍。这时可以采取在⾏尾添加冗余数据的⽅式,使其⾏字节数为32的倍数。
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格式。
⽂件头信息:
bfType=2字节:⼀定为19778,其转化为⼗六进制为0x4d42,对应的字符串为BM。
bfSize=4字节:⽂件⼤⼩
bfReserved1=2;⼀般为0
bfReserved2=2;⼀般为0
bfOffBits=4:从⽂件开始处到像素数据的偏移,也就是这两个结构体⼤⼩之和.
bmp图⽚结构头
字段⼤⼩(字节) 描述
biSize 4此结构体的⼤⼩
biWidth 4 图像的宽
biHeight  4图像的⾼
biPlanes  2图像的帧数,⼀般为1
biBitCount  2⼀像素所占的位数,⼀般是24
biCompression  4⼀般为0
biSizeImage  4像素数据所占⼤⼩,即上⾯结构体中⽂件⼤⼩减去偏移(bfSize-bfOffBits)
biXPelsPerMeter  4 ⼀般为0
biXPelsPerMeter  4  ⼀般为0
biClrUsed  4  ⼀般为0
biClrImportant  4  ⼀般为0
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格式拍一拍设置后缀
1. jpeg是有损压缩格式, 将像素信息⽤jpeg保存成⽂件再读取出来,其中某些像素值会有少许变化。在保存时有个质量参数可在[0,100]
之间选择,参数越⼤图⽚就越保真,但图⽚的体积也就越⼤。⼀般情况下选择70或80就⾜够了。
2. jpeg没有透明信息。
3. jpeg⽐较适合⽤来存储相机拍出来的照⽚,这类图像⽤jpeg压缩后的体积⽐较⼩。其使⽤的具体算法核⼼是离散余弦变换、Huffman
编码、算术编码等技术,有兴趣的同学可以在⽹上⼀⼤堆资料,本⽂就不详细介绍了。
PNG格式
1. png是⼀种⽆损压缩格式, 压缩⼤概是⽤⾏程编码算法。
2. png可以有透明效果。
3. png⽐较适合适量图,⼏何图。 ⽐如本⽂中出现的这些图都是⽤png保存,⽐⽤joeg保存体积要⼩。
再强调⼀下: jpeg⽐较适合存储⾊彩“杂乱”的拍摄图⽚,png⽐较适合存储⼏何特征强的图形类图⽚。
GIF格式
上⾯提到的bmp,jpeg,png图⽚都只有⼀帧,⽽gif可以保存多帧图像.gif中有个参数可以控制图⽚变化的快慢。在程序中可以使⽤这个参数,也可以⾃⼰定义⼀个参数,这就是为什么gif图⽚,在不同程序中查看时其变化速度不⼀样。
webp
google开发的⼀种有损、透明图⽚格式,相当于jpeg和png的合体,google声称其可以把图⽚⼤⼩减少40%。
视频格式
视频⽂件格式(简称:⽂件格式),视频封装格式(简称:视频格式),视频编码⽅式(简称:视频编码)。
⽂件格式:windows设置后缀名的⽬的是让相应的应⽤程序来打开相应的⽂件。可以随意更改后缀名,不会更改⽂件的内部数据格式。
视频封装格式:⼀种存储视频信息的容器。视频封装格式不同,也不会影响视频数据,主要是⼀种对视频数据的组合。因此,视频转换需要设置的本质就是:A设置需要的视频编码、B设置需要的⾳频编码、C选择需要的容器封装。⼀个完整的视频转换设置都⾄少包括了上⾯3个步骤。主要格式如下:
视频编码格式:对原始视频数据进⾏编码或解码的程序或算法。属于有损压缩。
1.h26x系列。
2.MPEG系列等。
现在我⽤的是MPEG封装,h264编码,MP4后缀名。
H.264分为Baseline Profile,Main Profile和High Profile,代表编码复杂程度。
H.264编码的GOP(Group of Picture)是由关键帧I,预测帧P、B组成。GOP越长,⼀个循环中包含的预测帧也就越多,压缩率越⾼,编解码难度越⾼,越不容易精确到帧(视频编辑要求精确到每⼀帧,也就是每⼀秒可以分离成24/29/30个画⾯)。使⽤<H.264编
码,Main/High Profile复杂度,MP4/TS封装>是⽬前最理想的⽅案。