最近在做视频检测,从回调函数中得到的图像数据不清楚是什么格式,查看图像信息头,biBitCount =16 ,biCompression =0,不知道是RGB16的格式 还是YUV格式??是YUV多少的???? 求高手赐教判断图像格式的方法!!!!
解决方案 »
- 急求朋友帮忙:使用“橡皮筋”技术画三角形
- 怎样捕获窗口右上角“最小化”,“关闭”按钮消息?
- 怎样实现锁定桌面的功能?
- 在dll中创建sdi的问题???
- 如何在Win32 Application 中将Radio Button 设为默认值,即运行后自动选择该项?(不支持Classwizard,没有类)急,在线等!!
- 怎样总是从ListBox末尾添加项目(AddString)????
- 如何改变TAB(标签)控件的宽度?
- 各位高手,帮忙看一下这个小问题!先回答有效先给分!
- 紧急!!!难题!!!
- 我是第一次提问,希望大家捧捧场!(关于vc++和8255连接的问题)谢谢!
- 关于SQL两个值的比对!
- 切换视图是怎样更新控件
LONG bmType;
LONG bmWidth;
LONG bmHeight;
LONG bmWidthBytes;
WORD bmPlanes;
WORD bmBitsPixel;
LPVOID bmBits;
} BITMAP, *PBITMAP;
从视频设备获取的图像数据不一定具有图像文件的格式,如BMP、JPEG、PNG等。
一下是一些常见图像文件的头部标志:
BMP: 0x00-0x01 "BM"
JPEG:0x06-0x09 "JFIF"
GIF: 0x00-0x02 "GIF"
PNG: 0x01-0x03 "PNG"如果你知道图像的尺寸,也可以大概估算出每个像素占用多少bit
http://xuyingpin.blogbus.com/logs/18115593.html
文件头 位图信息头
色彩表 位图阵列
1. 文件头
文件头含有位图文件的类型,大小,数据结构等信息,文件头由下面一个结构组成:
typedef struct tagBITMAPFILEHEADER{//BMFH
WORD bfTupe;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
}BITMAPFILEHEADER;
在上面结构中,每一个成员的含义解释是如下:
bfType 表明位图文件的类型;
bfSize 表明位图文件的大小,以字节为单位;
bfReserved1 代表保留字,必须为0;
bfReserved2 也是保留字,必须为0;
bfOffBits 表明位图阵列的起始位置,也就是位图阵列相对于位图文件头的偏移量,以字节为单位;
2. 位图信息头
位图信息头含有DIB(device-independent bitmap)与设备无关位图的大小和颜色格式。信息头由下面一个结构组成:
tyopedef struct tagBITMAPINFOHEADER{
DWORD biSize;
LONG biHeight;
WORD biplanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
}BITMAPINFOGEADER;
以上每个字段的具体含义解释如下;
biSize 代表BITMAPINFOGEADER结构所需要的字节数。
biWidth,biHeigh 代表一象素为单位的BMP图象的宽度和高度。
BiPlatles 给出输出设备的平面数,必须置为1。
biBitCount 给出每个象数的位数。
biCompress 表示该图象所用的压缩类型。
biSizeImage 代表图象字节数
biXPelsPerMeter 代表图象的水平分辨率(以目标设备的每米象素数为单位)。
biYPelsPerMeter 代表图象的垂直分辨率(以目标设备的每米象素数为单位)。
BiClrUsed 给出调色板中图象实际使用的颜色数。若此值为0,那么图象使用的颜色由biBitCount的值确定;若此值不为0,当bitBitCount的值小于16,则biClrUsed给出图形设备驱动程序或设备驱动程序将访问的实际使用的颜色数。当bitBitCount大于等于16,则biCirUsed给出用于优化调色板性能的参考色彩表的大小。
BiClrImportant 给出对于图象显示来说是重要的颜色索引值。此值若为0,则所有颜色都是重要的。
3. 色彩表
色彩表定义了一个颜色表,用于说明图象中的颜色。它有若干个表项,每一个表项都由RGBQUAD结构定义了一种颜色,每一种颜色都可由红、绿、蓝三个基色的不同分量组合而成,RGBQUAD实际上描述了一种颜色的红、绿、蓝三色的分量。
RGBQUAD结构定义如下:
typedef struct tagRGBQUAD{//rgbq
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
}RGBQUAD;
色彩表中表项的个数由biBitCount来定:
当biBitCount=1、4、8时,色彩表分别有2,16,256个表项;若某点的象素值为n,则该象素的颜色为色彩表中的第n项所定义的颜色。
当biBitCount=24时,色彩表表项为空;位图阵列的每3个字节表示一个象素,这3个字节直接定义了象素颜色中的蓝、绿、红的相对亮度。
在RGBQUAD定义的颜色中,兰色的亮度由rgbBlue定义,绿色亮度由rgbGreen定义,红色的亮度由rgbRed定义,rgbReserved必须为零。若某表项的值为:FF,00,00,那么他定义的颜色为纯蓝色。
当biBitCount=16,32时,情况较为复杂,并不常用。4. 位图阵列
位图阵列存放图象的所有象素值。当biBitCount=1、4、8时,位图阵列中每个象素的值是该象素颜色在色彩表中的索引序号。象素值与色彩表是紧密相关的,对于同样的一个位图图象,如果色彩表不一样,那位图阵列里的象素值也将不一样。下图是包含有4种颜色,16*4象素的色彩表与位图数据阵列的信息:
色彩表
颜色索引号 红色分量 绿色分量 蓝色分量
0 255 255 0
1 128 255 255
2 0 255 128
3 255 128 128
位图数据阵列
0 1 2 2 2 1 1 1 2 3 3 3 3 3 3 3
2 2 2 2 0 0 0 0 0 0 0 0 0 0 2 2
1 1 1 1 1 1 1 0 0 0 0 0 0 0 2 2
2 2 2 2 3 3 3 3 3 3 1 1 1 1 0 0
其中,位图阵列中的每个象素占用2个bits,其数据是象素颜色对应在色彩表中的索引号。图象列阵的产生方法是:从图象的左下脚开始逐行扫描图象,从左到右,从下到上,把图象的象素值全部记录下来。位图列阵数据的存储格式有压缩和非压缩两种。由于我们用到的是非压缩格式,所以在此不介绍有压缩格式。
在非压缩格式中,位图中每一个点的象素值对应于位图阵列的若干位,而位图阵列的大小由图象的宽度、高度及图象的颜色数(biBitCount)决定。
4.1图扫描行与位图阵列的关系
一个扫描行的象素值需要满足一定的要求,这种要求是每行的字节数必须为4的倍数,不足的补零。若记录一个扫描行的象素值需要n个字节,那么公式为:
当(biWidth*biBitCount)能被32整除时;
n=(biWidth*biBItCount)/8。
当(biWidth*biBitCount)不能被32整除时;
n=((biWidth*biBitCount)/32)*4+4。
比实际图象多出的象素其值要用0表示。位图阵列的大小为n*biHeight字节,位图阵列中第0—n-1个字节代表图象的第一个扫描的象素值,第 n—2n-1个字节代表图象的第二个行的象素值,…….,第(I-1)*n---I*n-1个字节代表图象的第I个扫描行的象素值。
4.2位图象素值与位图阵列的对应关系
以第I个扫描行为例,若第I扫描行的象素值的n个字节分别为:b0,b1….b(n-1),则根据表示一个象素值所需位数的不同,对应关系如下:
当biBtCount=1时,一个象素值可用1比特(1位)表示。b0的第七位表示位图的第I扫描行的第1个象素值,第6位表示第2个象素值,….,第0位表示第8个象素值;b1第7位表示第I扫描行的第9个象素值, 第6位表示第10个象素值, 第5位表示第11个象素值,….。
当biBtCount=4时,一个象素值可用4比特(4位)表示。b0的第7--4位表示位图的第I扫描行的第1个象素值,第3--0位表示第2个象素值, b1第7--4位表示第I扫描行的第3个象素值, 第3--0位表示第4个象素值,….。
当biBtCount=8时,一个象素值可用8比特(8位)表示。b1表示位图的第I扫描行的第1个象素值, b2表示第I扫描行的第2个象素值,……。
当biBtCount=24时,一个象素值可用24比特(24位)表示。b0,b1,b2表示位图的第I扫描行的第1个象素值, b3,b4,b5表示第I扫描行的第2个象素值,……。