bmp格式 8bit与24bit相互转换
一、实验要求
在图像处理软件中生成8bit和24bit深度的BMP文件,编写程序实现不同像素深度文件的相互转换。重点掌握函数定义、缓存区分配、倒序读写、结构体操作。
二、算法原理
1. 8bit转24bit
8bitBMP图像文件包括4部分:
位图文件头fileheader
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
位图信息头infoheader
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
调色板
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
以及位图数据,结合调色板使用颜色索引值。
24bit图像不含调色板,位图数据为取值范围【0,255】的B,G,R数据,即BGR分别对应8bit。
编程思路:
2. 24bit转8bit
24bit转8bit相对困难,因为要设计图像的调色板
几种思路:(1)看看画图软件的调色板是怎么设计的
调色板中间部分很有顺序,但最开始和最后的部分没有看懂为什么这样设计,觉得可能是为了方便向其他深度如4bit转换。所以没有选择此方法。
(2)在【0,255】上等间隔取值
8bit对应256种颜色,256不是立方数,因此可以选择RGB取3+3+2=8bit。但是似乎哪个颜色分量取2bit都对整体画面会产生较大影响,所以放弃这个方法。
如果要使三个彩色分量平均取值