如何把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
补充:软件开发 , C语言 ,
上一个:一个控制音量大小的类
下一个:如何提取并保存图标资源
- 更多C/C++疑问解答:
- 关于c++的cout输出的问题。
- 在学校里学过C和C++,不过学的很一般,现在自学C#,会不会很难?
- 全国计算机二级C语言笔试题
- 已知某树有2个2度结点,3个3度结点,4个4度结点,问有几个叶子结点?
- c++数据结构内部排序问题,整数排序
- 2012九月计算机二级C语言全国题库,,急求急求
- 如果assert只有一个字符串作为参数,是什么意思呢?
- C语言中,哪些运算符具有左结合性,哪些具有右结合性,帮忙总结下,谢谢了!
- 为什么用结构体编写的程序输入是,0输不出来啊~~~
- 将IEEE—754的十六进制转化为十进制浮点类型,用C或C++都行,多谢各位大侠啊,非常感谢!
- 为什么这个程序求不出公式?
- 这个链表倒置的算法请大家分析下
- c语言函数库调用
- C语言unsigned int纠错
- C语言快排求解啊