分享
 
 
 

如何把DIB转换成DDB

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

//原著:不知道(反正是外国人)

//译者:重庆大学光电工程学院 贾旭滨

//欢迎大家批评指教,谢谢!

首先,你可以不必把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->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(), //设备上下文的句柄

(lpbitmapinfoheader)lpbi, //位图信息头指针

(long)cbm_init, //初始化标志

lpdibbits, //初始化数据指针

(lpbitmapinfo)lpbi, //位图信息指针

dib_rgb_colors ); //颜色数据的使用方式

if (pal.getsafehandle())

dc.selectpalette(poldpal,false);

return hbm;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有