3146|5

77

帖子

0

TA的资源

一粒金砂(初级)

 

ce下 bmp 24位转8位 [复制链接]

BMP图 24位转8位的问题
我想把24位转成8位,原图就是黑白图 想转成8位的bmp

void OnScreenSave(const char *filename)
{
HDC  hScrDC, hMemDC; //屏幕和内存设备描述表
int  width, height;

BYTE  *lpBitmapBits = NULL;      //指针用来保存每像素的颜色值

hScrDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);//为屏幕创建设备描述表

width = GetDeviceCaps(hScrDC, HORZRES);
height = GetDeviceCaps(hScrDC, VERTRES);
hMemDC = CreateCompatibleDC(hScrDC); //为屏幕设备描述表创建兼容的内存设备描述表

//CE下支持24位,为bitmap初始化BITMAPINFO,使用CreateDIBSection
BITMAPINFO RGB24BitsBITMAPINFO;
ZeroMemory(&RGB24BitsBITMAPINFO, sizeof(BITMAPINFO));
RGB24BitsBITMAPINFO.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
RGB24BitsBITMAPINFO.bmiHeader.biWidth = width;
RGB24BitsBITMAPINFO.bmiHeader.biHeight = height;
RGB24BitsBITMAPINFO.bmiHeader.biPlanes = 1;
RGB24BitsBITMAPINFO.bmiHeader.biBitCount = 24;

//使用CreateDIBSection和SelectObject得到bitmap指针lpBitmapBits
HBITMAP directBmp = CreateDIBSection(hMemDC, (BITMAPINFO*)&RGB24BitsBITMAPINFO, DIB_RGB_COLORS, (void **)&lpBitmapBits, NULL, 0);
HGDIOBJ previousObject = SelectObject(hMemDC, directBmp);

BitBlt(hMemDC, 0, 0, width, height, hScrDC, 0, 0, SRCCOPY);// 把屏幕设备描述表拷贝到内存设备描述表中
BITMAPFILEHEADER bmBITMAPFILEHEADER;

//bimap头文件为了写bmp文件
ZeroMemory(&bmBITMAPFILEHEADER, sizeof(BITMAPFILEHEADER));
bmBITMAPFILEHEADER.bfType = 0x4d42;
bmBITMAPFILEHEADER.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmBITMAPFILEHEADER.bfSize = bmBITMAPFILEHEADER.bfOffBits + ((width*height)*3);

FILE *mStream = NULL;
if((mStream = fopen(filename, "wb")))
{  
//写位图文件头
fwrite(&bmBITMAPFILEHEADER, sizeof(BITMAPFILEHEADER), 1, mStream);
fwrite(&(RGB24BitsBITMAPINFO.bmiHeader), sizeof(BITMAPINFOHEADER), 1, mStream);
fwrite(lpBitmapBits, 3*width*height, 1, mStream);
fclose(mStream);
}
DeleteObject(hMemDC);
DeleteObject(hScrDC);
DeleteObject(previousObject);
}

最新回复

8位是不是要调色板的?  详情 回复 发表于 2009-12-22 23:37

回复
举报

79

帖子

0

TA的资源

一粒金砂(初级)

 
参考:
[url=http://blog.eeworld.net/cokesprite/archive/2006/11/27/1417392.aspx][/url]
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

 
引用 1 楼 flandy1982 的回复:
参考:
http://blog.eeworld.net/cokesprite/archive/2006/11/27/1417392.aspx

好像不太行
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

 
第一,既然是24位的,又怎么会是黑白图?费解。
第二,你的代码都列出来了,那么,你遇到什么问题了呢?

24位bmp转8位,肯定是要损失效果的,做法无非就是把RGB低位的数据丢掉。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

 
我做过,从16位,换到24位的。。。OAL里面的LCD处理文件及显示驱动代码得修改的,只做小部分修改就可以的
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

 
8位是不是要调色板的?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

猜你喜欢
随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表