首页 随笔 乐走天涯 程序资料 评论中心 Tag 论坛 其他资源 搜索 消息中心 联系我 关于 RSS

把DIB转换成DDB


日期: 2002-01-25 14:00 | 联系我 | 关注我: SteemIT, Twitter, Google+

你可以把一个设备无关位图(DIB)在不转换成设备相关位图(DDB)的情况下显示到设备环境中,但是,这样做显示速度将慢很多。如果进行转换,将提高显示速度。下面是其实现代码。

HBITMAP DIBToDDB( HANDLE hDIB ) { LPBITMAPINFOHEADER lpbi; HBITMAP hbm; CPalette pal; CPalette* pOldPal; CClientDC dc(NULL); if (hDIB == NULL) return NULL; lpbi = (LPBITMAPINFOHEADER)hDIB; int nColors = lpbi->biClrUsed ? lpbi->biClrUsed : 1 << lpbi->biBitCount; BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ; LPVOID lpDIBBits; if( bmInfo.bmiHeader.biBitCount > 8 ) lpDIBBits = (LPVOID)((LPDWORD)(bmInfo.bmiColors + bmInfo.bmiHeader.biClrUsed) + ((bmInfo.bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0)); else lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors); // Create and select a logical palette if needed if( nColors <= 256 && dc.GetDeviceCaps(RASTERCAPS) & RC_PALETTE) { UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors); LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize]; pLP->palVersion = 0x300; pLP->palNumEntries = nColors; for( int i=0; i < nColors; i++) { pLP->palPalEntry[i].peRed = bmInfo.bmiColors[i].rgbRed; pLP->palPalEntry[i].peGreen = bmInfo.bmiColors[i].rgbGreen; pLP->palPalEntry[i].peBlue = bmInfo.bmiColors[i].rgbBlue; pLP->palPalEntry[i].peFlags = 0; } pal.CreatePalette( pLP ); delete[] pLP; // Select and realize the palette pOldPal = dc.SelectPalette( &pal, FALSE ); dc.RealizePalette(); } hbm = CreateDIBitmap(dc.GetSafeHdc(), // handle to device context (LPBITMAPINFOHEADER)lpbi, // pointer to bitmap info header (LONG)CBM_INIT, // initialization flag lpDIBBits, // pointer to initialization data (LPBITMAPINFO)lpbi, // pointer to bitmap info DIB_RGB_COLORS ); // color-data usage if (pal.GetSafeHandle()) dc.SelectPalette(pOldPal,FALSE); return hbm; }


 文章评论

第 1 楼  发表于 2013-01-01 16:35 | 641402351 的所有评论
请问你自己转dib到DDB成功了吗?我用这个函数怎么也转不成功

共有评论 1 条, 显示 1 条。

发表你的评论
如果你想针对此文发表评论, 请填写下列表单:
姓名: * 必填 (Twitter 用户可输入以 @ 开头的用户名, Steemit 用户可输入 @@ 开头的用户名)
E-mail: 可选 (不会被公开。如果我回复了你的评论,你将会收到邮件通知)
网站 / Blog: 可选
反垃圾广告: 为了防止广告机器人自动发贴, 请计算下列表达式的值:
1 x 4 + 2 = * 必填
评论内容:
* 必填
你可以使用下列标签修饰文字:
[b] 文字 [/b]: 加粗文字
[quote] 文字 [/quote]: 引用文字

 
首页 随笔 乐走天涯 猎户星 Google Earth 程序资料 程序生活 评论 Tag 论坛 资源 搜索 联系 关于 隐私声明 版权声明 订阅邮件

程序员小辉 建站于 1997 ◇ 做一名最好的开发者是我不变的理想。
Copyright © XiaoHui.com; 保留所有权利。