图片位深度以及转换办法

位图文件的格式:

  ① 位图文件头,所用结构体:BITMAPFILEHEADER,占14个字节

  ② 位图信息头,所用结构体:BITMAPINFOHEADER,占40个字节

  ③ 颜色表项,所用结构体:RGBQUAD,由biBitCount值决定

  ④ 数据区,当结构体BITMAPINFOHEADER中的成员变量

biBitCount = 1时,1个字节代表8个像素;

biBitCount = 2时,1个字节代表2个像素;

biBitCount = 8时,1个字节代表1个像素;

biBitCount = 16时,2个字节代表1个像素;

biBitCount = 24时,3个字节代表1个像素;

RGBQUAD结构体的定义如下:

typedef struct tagRGBQUAD {
BYTE    rgbBlue;                // 蓝色分量 
BYTE    rgbGreen;              // 绿色分量 
BYTE    rgbRed;                // 红色分量 
BYTE    rgbReserved;        // 保留值,必须为0.
} RGBQUAD;
 

即一个RGBQUAD结构体占4个字节,

当biBitCount = 1,2,  4,  8时,颜色表项分别占2,   4,   16,256个RGBQUAD结构体大小的空间;

当biBitCount = 24时,③颜色表项不占空间,即位图文件只有①②④三项,这是因为数据区中3个字节代表一个像素,本身含有三原色分量值。

需要注意的问题:

    1. bmp数据存储时按行从左到右、按列从下到上扫描,所以对于24位bmp文件,数据区前三个字节代表位图左下角第一个元素;

2. bmp文件存储的图片数据每行所占的字节数都是4的整数倍,不够的用0补充,所以有

biSizeImage = ((((bi.Width*bitBitCount)+31)&~31)/8)*bi.biHeight

    3. 对于24位bmp文件,若图片每行像素所占字节数满足是4的整数倍这个条件,由于BITMAPFILEHEADER和BITMAPINFOHEADER所占的总字节数为54,不是4的倍数,所以补0后为56字节。

个人理解:

         bibitcount 为1,2,4,8 代表着每个像素点的色彩深度为 2^n , 即每个像素点需要去参考的colortable深度分别为 2, 4 , 16, 256 ,通俗来讲,bibitcount为 8 ,那它像素点的深度就是256,如果此时它的像素点值是127, 那就要从colortable中去查找,colortable的大小就呼之欲出。

        其次对于不同的bitmap,可以通过windows系统自带的画图来进行编辑,编辑之后保存的时候可以选择如下:

        图片位深度以及转换办法_第1张图片

 

        

你可能感兴趣的:(算法)