社区
图形处理/算法
帖子详情
怎样把Dib转化为HBITMAP?
kevinxli
2004-03-16 10:24:20
怎样把Dib转化为HBITMAP
...全文
134
4
打赏
收藏
怎样把Dib转化为HBITMAP?
怎样把Dib转化为HBITMAP
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
hmsxg4160
2004-03-17
打赏
举报
回复
mark
Rothemback
2004-03-17
打赏
举报
回复
辛苦了
taianmonkey
2004-03-16
打赏
举报
回复
BOOL Tofile(HBITMAP hbitmap, LPSTR lpfilename)
{
HDC hdc; //设备描述表
int ibits;
WORD wbitcount; //当前显示分辨率下每个像素所占字节数
//位图中每个像素所占字节数,定义调色板大小,位图中像素字节大小,位图文件大小 ,写入文件字节数
DWORD dwpalettesize=0, dwbmbitssize, dwdibsize, dwwritten;
BITMAP bitmap; //位图属性结构
BITMAPFILEHEADER bmfhdr; //位图文件头结构
BITMAPINFOHEADER bi; //位图信息头结构
LPBITMAPINFOHEADER lpbi; //指向位图信息头结构
//定义文件,分配内存句柄,调色板句柄
HANDLE fh, hdib, hpal,holdpal=NULL;
//计算位图文件每个像素所占字节数
hdc = CreateDC("display",NULL,NULL,NULL);
ibits = GetDeviceCaps(hdc, BITSPIXEL) * GetDeviceCaps(hdc, PLANES);
DeleteDC(hdc);
if (ibits <= 1)
wbitcount = 1;
else if (ibits <= 4)
wbitcount = 4;
else if (ibits <= 8)
wbitcount = 8;
else if (ibits <= 16)
wbitcount = 16;
else if (ibits <= 24)
wbitcount = 24;
else
wbitcount = 32;
//计算调色板大小
if (wbitcount <= 8)//小于八位按八位处理
dwpalettesize = (1 << wbitcount) * sizeof(RGBQUAD);
//设置位图信息头结构
GetObject(hbitmap, sizeof(BITMAP), (LPSTR)&bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = bitmap.bmWidth;
bi.biHeight = bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wbitcount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
dwbmbitssize = ((bitmap.bmWidth * wbitcount+31)/32)* 4 * bitmap.bmHeight ;
//为位图内容分配内存
hdib = GlobalAlloc(GHND,dwbmbitssize + dwpalettesize +
sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hdib);
*lpbi = bi;
// 处理调色板
hpal = GetStockObject(DEFAULT_PALETTE);
if (hpal)
{
hdc = ::GetDC(NULL);
holdpal = SelectPalette(hdc, (HPALETTE)hpal, FALSE);
RealizePalette(hdc);
}
// 获取该调色板下新的像素值
GetDIBits(hdc, hbitmap, 0, (UINT) bitmap.bmHeight,(LPSTR)lpbi +
sizeof(BITMAPINFOHEADER)+dwpalettesize,(BITMAPINFO*)lpbi, DIB_RGB_COLORS);
//恢复调色板
if (holdpal)
{
SelectPalette(hdc, (HPALETTE)holdpal, TRUE);
RealizePalette(hdc);
::ReleaseDC(NULL, hdc);
}
//创建位图文件
fh = CreateFile(lpfilename, GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL|
FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (fh == INVALID_HANDLE_VALUE)
return FALSE;
// 设置位图文件头
bmfhdr.bfType = 0x4d42; // "bm"
dwdibsize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+dwpalettesize + dwbmbitssize;
bmfhdr.bfSize = dwdibsize;
bmfhdr.bfReserved1 = 0;
bmfhdr.bfReserved2 = 0;
bmfhdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER)+ dwpalettesize;
// 写入位图文件头
WriteFile(fh, (LPSTR)&bmfhdr, sizeof(BITMAPFILEHEADER), &dwwritten, NULL);
// 写入位图文件其余内容
WriteFile(fh, (LPSTR)lpbi, dwdibsize, &dwwritten, NULL);
//清除
GlobalUnlock(hdib);
GlobalFree(hdib);
CloseHandle(fh);
return TRUE;
}
hglcsdn
2004-03-16
打赏
举报
回复
创建一个DIBSECTION,然后把图像数据复制到创建时得到的指针
DDB与
DIB
的格式互转(代码)
我遇到了这个问题,于是在网上查了好多资料,搞了一天才写出了两个函数进行
转化
,将32位的DDB和
DIB
互相转换。(包含详细的注释) 如果你需要转换其他格式的,可以自己设定参数。 网上下的那些代码都有问题,我这个是...
一个简单的C
DIB
类
〉C
DIB
功能 提供针对设备无关位图的一系列操作。 〉C
DIB
使用方法 将
DIB
目录复制到工程的原文件目录中。 在工程的Source Files中添加
DIB
文件夹,并...最后调用EnhanceColor()将C
Dib
对象
转化
为可以显示特殊信息的图像
(转)如何将H
BITMAP
类型
转化
为CMemFile对象?
HANDLE CBmp2Avi::
Bitmap
2
Dib
( H
BITMAP
h
bitmap
, UINT bits ){HANDLE h
dib
;HDC hdc ;
BITMAP
bitmap
;UINT wLineLen ;DW
3. GDI+
Bitmap
和GDI H
BITMAP
互转
本文详细的讲解了带透明度的H
BITMAP
和
Bitmap
的转换,解决常见的
Bitmap
转H
BITMAP
背景变浅,H
BITMAP
转
Bitmap
背景变黑的问题,并演示了如何输出H
BITMAP
和
Bitmap
的每行像素,所有代码封装成了类,可以直接在生产环境中...
C++将H
BITMAP
保存为bmp图片
BOOL CBMP2ArrayMultiplyDlg::Save
Bitmap
ToFile(H
BITMAP
h
Bitmap
, CString szfilename) { HDC hDC; //当前分辨率下每象素所占字节数 int iBits; //位图中每象素所占字节数 WORD wBi
图形处理/算法
19,468
社区成员
50,698
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章