« | Mar.2021 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | | |
|
公告 |
本站技术贴除标明为“原创”的之外,其余均为网上转载,文中我会尽量保留原作者姓名,若有侵权请与我联系,我将第一时间做出修改。谢谢!
——既瑜 |
统计 |
blog名称:★既瑜★ 日志总数:183 评论数量:636 留言数量:-25 访问次数:1369652 建立时间:2005年3月12日 |
OICQ:215768265
njucs2001@hotmail.com
erichoo1982@gmail.com |
|
W3CHINA Blog首页 管理页面 写新日志 退出
[【技术文档】]32位位图到24位位图的转换 |
32位位图到24位位图的转换
(一)功能在图像处理的很多实际应用中,我们需要对图像的颜色表示进行转换(如,将32位颜色转换到24位颜色等等)。本文通过一个简单的例子,说明了32位颜色到24位颜色的转换过程。程序假设当前windows桌面颜色为32位颜色值。(一)功能在图像处理的很多实际应用中,我们需要对图像的颜色表示进行转换(如,将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);}
(四)其它说明本程序被限制在了固定的屏幕格式,如果想要打破这个限制,必须从底层直接操作位图文件。(四)其它说明本程序被限制在了固定的屏幕格式,如果想要打破这个限制,必须从底层直接操作位图文件。本文引用通告地址: http://blog.csdn.net/hitjinming/services/trackbacks/428191.aspx
|
阅读全文(16970) | 回复(8) | 编辑 | 精华 |
回复:32位位图到24位位图的转换 |
chen(游客)发表评论于2010/4/3 13:43:36 | 深圳好日子搬迁有限公司是经深圳运输局批准和国家工商注册的一家大型的正规搬迁运输公司。公司为方便广大市民就近搬迁,特在深圳各区镇开设有: 深圳龙岗搬家公司 深圳盐田搬家公司 深圳福田搬家公司 深圳罗湖搬家公司 深圳龙华搬家公司 深圳南山搬家公司 深圳宝安搬家公司 深圳空调回收
|
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
回复:32位位图到24位位图的转换 |
ewa(游客)发表评论于2009/8/8 11:16:37 | 这儿有一个转化位图位深的程序不错, 推荐一下:
http://hi.baidu.com/wudging/blog/item/7819fc00fbc62d19738b6551.html
|
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
回复:32位位图到24位位图的转换 |
刘丹(游客)发表评论于2005/12/13 20:28:22 | 以下引用njucs在2005-12-9 14:07:52的评论:
16位转成32位?
我觉得转是可以的,但转出来应该没什么效果
那么请楼主说说您的大概思路?应该如何转?
|
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
回复:32位位图到24位位图的转换 |
16位转成32位?
我觉得转是可以的,但转出来应该没什么效果
|
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
回复:32位位图到24位位图的转换 |
刘丹(游客)发表评论于2005/12/9 10:25:57 | 我现在是逆操作,把16位的图转换成32位的图像信息,我个人认为这是不可行的,请问楼主,您认为可行么?
|
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
回复:32位位图到24位位图的转换 |
测试了,没有任何问题,我这里运行出来是对的
|
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
回复:32位位图到24位位图的转换 |
运用者(游客)发表评论于2005/11/21 18:04:03 | 希望作者能查查到底哪里出了问题,
等待回音.
|
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
回复:32位位图到24位位图的转换 |
某某(游客)发表评论于2005/11/21 17:55:03 | 用不了
得到的是黑白图片,而且里面的数据也变了
所以看到的图片都不一样了.
|
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
» 1 »
|