设为首页 加入收藏

TOP

如何把DIB转换成DDB
2014-11-23 20:10:07 来源: 作者: 【 】 浏览:7
Tags:如何 DIB 换成 DDB

首先,你可以不必把DIB转换成DDB就可以让它显示在设备上。但是那样的话,你都会看见会程序运行得有多慢了,而且你也不能使用一些有关DDB操作的函数功能了,诸如BitBlt()....

以下是从DIB创建一个DDB的基本步骤:

1.从DIB颜色表信息中的信息可以创建一个逻辑调色板,如果设备支持的话,你只需要做这一步。为了创建一个调色板,就需要分配给逻辑调色板结构。初始化palversion和palnumentries,从DIB中的颜色表把颜色数拷贝过来。然后我们就可以使用createpalette()函数来使用我们初始化的逻辑调色板了。

2.把逻辑调色板选到设备中,然后实现它。

3.创建DDB,可以使用createdibbitmap()函数。

4.最后不要忘记释放掉分给逻辑调色板结构的内存。

虽然这样就可以创建一个逻辑调色板了,但它没有返回信息给所调用的程序代码。如果DIB描述的是一个256色的位图的话,而且设备也只支持256色,那么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 palpalentry[i].pered = bminfo.bmicolors[i].rgbred;

plp->palpalentry[i].pegreen = bminfo.bmicolors[i].rgbgreen;

plp->palpalentry[i].peblue = bminfo.bmicolors[i].rgbblue;

plp

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇自己动手制作一款简洁实用的图片.. 下一篇如何提取并保存图标资源

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: