32位位图到24位位图的转换
2010-05-18 20:41
375 查看
(一)功能
在图像处理的很多实际应用中,我们需要对图像的颜色表示进行转换(如,将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);
}
(四)其它说明
本程序被限制在了固定的屏幕格式,如果想要打破这个限制,必须从底层直接操作位图文件。
在图像处理的很多实际应用中,我们需要对图像的颜色表示进行转换(如,将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);
}
(四)其它说明
本程序被限制在了固定的屏幕格式,如果想要打破这个限制,必须从底层直接操作位图文件。
相关文章推荐
- 32位位图到24位位图的转换
- 32位位图与24位位图互相转换
- 实现1位,4位,8位,24位BMP位图的互相转换的方法,32位转24位
- 24位真彩色位图转换成8位灰度图片的代码实现
- 24位BMP位图转换成ASCII码字符图
- BMP位图32位转为24位深度
- 24位 位图与32位 位图差异解析
- 24位真彩色位图和8位灰度位图相互转换(C语言实现)
- 8位位图转换成24位位图
- BMP的8位位图转换24位位图
- 8位位图和24位位图的相互转换
- directshow 之 视频位图24位32位存储
- 8位位图转换为24位位图
- 将真彩色转换成增强色的方法(即RGB32位或RGB24位颜色转换成RGB16位颜色的函数)
- bmp文件格式中rgb555与rgb888之间的转换,24位与16位位图的转换
- 8位位图转换成24位位图
- bmp文件格式中rgb555与rgb888之间的转换,24位与16位位图的转换
- 24位RGB位图转换成1位位图
- 24位真彩色位图转换成8位灰度图片的代码实现
- 将24位位图转换8位位图