您的位置:首页 > 其它

32位位图到24位位图的转换

2010-05-18 20:41 323 查看
(一)功能
在图像处理的很多实际应用中,我们需要对图像的颜色表示进行转换(如,将32位颜色转换到24位颜色等等)。本文通过一个简单的例子,说明了32位颜色到24位颜色的转换过程。程序假设当前windows桌面颜色为32位颜色值。

(二)准备工作
建立VC CONSOLE APPLICATION,选择MFC SUPPORT

(三)主函数
函数Bmp32ToBmp24将32位位图转换到24位位图格式。
注意:该函数假设当前windows桌面颜色为32位颜色值。

// transform 32-bit bitmap format to 24-bit bitmap format
void Bmp32ToBmp24(char Filename[])
{
char Filename2[] = "output.bmp";

//注意:如果没有LR_CREATEDIBSECTION,位图颜色将被映射到屏幕DC颜色
//也就是说,如果屏幕是16位颜色,则所有的图像都将映射到16位颜色
HBITMAP hbmp32 = (HBITMAP) LoadImage(NULL, Filename,
IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE |
LR_CREATEDIBSECTION);

BITMAP bmp;//获取位图信息
GetObject(hbmp32, sizeof(BITMAP), &bmp);

printf("Image Bit Depth : %d/nWidth : %d , Height : %d /n",
bmp.bmBitsPixel, bmp.bmWidth, bmp.bmHeight);//显示位图颜色模式和图像宽高

//计算24位图像每行的字节数
int BytesPerLine = 3 * bmp.bmWidth;
while(BytesPerLine % 4 != 0)
BytesPerLine ++;

BITMAPINFOHEADER bih = {0};//位图信息头
bih.biBitCount = 24;//每个像素字节大小
bih.biCompression = BI_RGB;
bih.biHeight = bmp.bmHeight;//高度
bih.biPlanes = 1;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biSizeImage = BytesPerLine * bmp.bmHeight;//图像数据大小
bih.biWidth = bmp.bmWidth;//宽度

BITMAPFILEHEADER bfh = {0};//位图文件头
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//到位图数据的偏移量
bfh.bfSize = bfh.bfOffBits + bih.biSizeImage;//文件总的大小
bfh.bfType = (WORD)0x4d42;

FILE *fp = fopen(Filename2, "w+b");

fwrite(&bfh, 1, sizeof(BITMAPFILEHEADER), fp);//写入位图文件头

fwrite(&bih, 1, sizeof(BITMAPINFOHEADER), fp);//写入位图信息头

byte * p = new byte[bih.biSizeImage];

//获取当前32位图像数据
GetDIBits(GetDC(NULL), hbmp32, 0, bmp.bmHeight, p, (LPBITMAPINFO)&bih, DIB_RGB_COLORS);

//只取rgb值,存入文件
byte b = 0;//用于填充
for(int i = 0 ; i < bmp.bmWidth * bmp.bmHeight ; i ++)
{
//32位位图图像的格式为:Blue, Green, Red, Alpha
fwrite(&(p[i * 3]), 1, 3, fp);
if(i % bmp.bmWidth == bmp.bmWidth - 1)//填充字节
{
for(int k = 0 ; k < (BytesPerLine - bmp.bmWidth * 3) ; k ++)
fwrite(&b, sizeof(byte), 1, fp);
}
}

delete [] p;

fclose(fp);

DeleteObject(hbmp32);
}

(四)其它说明
本程序被限制在了固定的屏幕格式,如果想要打破这个限制,必须从底层直接操作位图文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: