图像格式
图像的基本数据结构: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位,32位处理器可以一次性处理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格式
- jpeg是有损压缩格式, 将像素信息用jpeg保存成文件再读取出来,其中某些像素值会有少许变化。在保存时有个质量参数可在[0,100]之间选择,参数越大图片就越保真,但图片的体积也就越大。一般情况下选择70或80就足够了。
- jpeg没有透明信息。
- jpeg比较适合用来存储相机拍出来的照片,这类图像用jpeg压缩后的体积比较小。其使用的具体算法核心是离散余弦变换、Huffman编码、算术编码等技术,有兴趣的同学可以在网上找一大堆资料,本文就不详细介绍了。
PNG格式
- png是一种无损压缩格式, 压缩大概是用行程编码算法。
- png可以有透明效果。
- 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封装>是目前最理想的方案。