如何判断图像格式?????????????????

ns22020426 2008-11-25 03:44:06
最近在做视频检测,从回调函数中得到的图像数据不清楚是什么格式,查看图像信息头,biBitCount =16 ,biCompression =0,不知道是RGB16的格式 还是YUV格式??是YUV多少的???? 求高手赐教判断图像格式的方法!!!!
...全文
112 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
cmchao 2008-11-26
BMP文件的结构:

文件头

位图信息头

色彩表

位图阵列


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个象素值,……。
回复
ringphone 2008-11-26
看一下这里:
http://xuyingpin.blogbus.com/logs/18115593.html
回复
ns22020426 2008-11-25
一个像素占2个字节,我已经知道了。可是一个字节占两个字节的格式有好多种,我对YUV这种格式比较生疏,不知道它的头文件应该是什么样子??????现在不知道怎么转成标准的灰度图!!!!!
回复
程序员刘帅 2008-11-25
可否把这个头部信息发上来?
从视频设备获取的图像数据不一定具有图像文件的格式,如BMP、JPEG、PNG等。
一下是一些常见图像文件的头部标志:
BMP: 0x00-0x01 "BM"
JPEG:0x06-0x09 "JFIF"
GIF: 0x00-0x02 "GIF"
PNG: 0x01-0x03 "PNG"

如果你知道图像的尺寸,也可以大概估算出每个像素占用多少bit
回复
实达诚实 2008-11-25
typedef struct tagBITMAP {
LONG bmType;
LONG bmWidth;
LONG bmHeight;
LONG bmWidthBytes;
WORD bmPlanes;
WORD bmBitsPixel;
LPVOID bmBits;
} BITMAP, *PBITMAP;
回复
smaltdd 2008-11-25
就是你说的了,查看文件信息头。具体的我也去google一下
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2008-11-25 03:44
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……