大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 程序开发 -> 在VC5中显示256色位图

在VC5中显示256色位图

时间: 2021-07-31 作者:daque

李欣 周学泳 ---- 在windows的编制程序中,彩色图像的表露和处置从来是一个要害的课题,纵然是在显卡一致扶助真彩的即日,计划256色位图的表露也是有意旨的。经过对这一课题的计划,不妨领会怎样在vc第5中学实行装入图像,创造和运用绘图板,以及结果将图像画出来。 ---- 总的来说,要表露一幅256色的位图,开始应获得该图的相关消息,经过位图的脸色表创造一个论理绘图板,而后将这个绘图板选入摆设情况,实行这个绘图板,结果将位图用bitblt因变量正片到摆设情况就不妨了。 ---- 简直实行办法如次: ---- 1、承载位图并创造绘图板。 ---- 开始装入一幅位图,该位图既不妨以资源的情势与步调绑在一道,也不妨以文献的情势从外部装入。而后将该位图与一个cbitmap东西接洽(attach)起来。在这边咱们应运用api因变量loadimage(),而不是cbitmap类的分子因变量cbitmap::loadbitmap(),由于咱们须要获得该位图的dibsection构造,从这个构造中咱们不妨获得该位图的颜色消息,进而创造一个与那些颜色相配合的论理绘图板。运用cbitmap::loadbitmap()将会遗失咱们所需的位图的颜色消息。 ---- 获得位图后,下一步处事即是博得该位图的颜色消息。经过cbitmap:getobject()因变量,咱们不妨考察dibsection构造,居中获得位图的颜色数。普遍来说,那些消息生存于bitmapinfohead构造中,然而,动作dibsection构造的一局部,bitmapinfohead偶尔并未证明图像用了几何种脸色;碰到这种情景,咱们不妨看看图像的每一音素用了几位(bit)来刻画脸色,即使是8位的话,由于8位二进制数不妨表白256种各别的值,以是该图像是256色的;同理,16bit表白是64k色。获得了位图所用的脸色数,就不妨创造论理绘图板了。颜色胜过256色的位图是没有脸色表(color table)的,这时候咱们只用大略地创造一个和摆设情况兼容的半色彩绘图板(halftone palette)就行了,在半色彩绘图板中包括着一切各别脸色的样品。这明显不是最好处置计划,但却是最大略的。 ---- 而对于脸色数小于或即是256的位图,咱们就要从新创造一个新的绘图板。先调配充满的外存空间来装入图像的脸色表,脸色表不妨运用api因变量getdibcolortable赢得;而后再调配充满的外存给兴建的论理绘图板,将方才获得的脸色表消息相映拷入兴建绘图板中的palpalentry域,并将palversion域设为0x300。创造了绘图板后,应将窗口革新重画。在简直的实行上,咱们设置了一个因变量getbitmapandpalette()来实行位图资源的装入和论理绘图板的创造,其功效实行框图如次(略) ---- 因变量简直实行如次:bool getbitmapandpalette(lpctstr lpszresource, cbitmap &bitmap, cpalette &pal,long *w,long *h){lpctstr lpszresourcename = (lpctstr)lpszresource;hbitmap hbmp = (hbitmap)::loadimage( afxgetinstancehandle(),             lpszresourcename,image_bitmap,0,0,                      lr_loadfromfile); //装入位图if( hbmp == null )   return false;bitmap.attach( hbmp ); // 将该位图与一个cbitmap东西接洽起来dibsection ds;bitmapinfoheader &bminfo = ds.dsbmih; bitmap.getobject( sizeof(ds), &ds );// 获得位图脸色数int ncolors = bminfo.biclrused ?bminfo.biclrused : 1 << bminfo.bibitcount; *w="bminfo.biwidth;" //获得位图宽窄值 *h="bminfo.biheight;" //获得位图莫大值 cclientdc dc(null); // 创造论理绘图板 if( ncolors> 256 )  pal.createhalftonepalette( &dc );else{  // 脸色数 <= 256 rgbquad *prgb="new" rgbquad[ncolors]; cdc memdc; memdc.createcompatibledc(&dc); memdc.selectobject( &bitmap ); ::getdibcolortable( memdc, 0, ncolors, prgb ); uint nsize="sizeof(logpalette)" + (sizeof(paletteentry) * ncolors); logpalette *plp="(logpalette" *) new byte[nsize]; plp->palversion = 0x300;  plp- >palnumentries = ncolors;  for( int i=0; ipalpalentry[i].pered = prgb[i].rgbred;   plp- >palpalentry[i].pegreen = prgb[i].rgbgreen;   plp- >palpalentry[i].peblue = prgb[i].rgbblue;   plp- >palpalentry[i].peflags = 0;  }  pal.createpalette( plp );  delete[] plp;  delete[] prgb;}return true;}  2.表露位图  在wm_paint动静的相应因变量onpaint()中实行。void onpaint() {cpaintdc dc(this); // device context for painting// create a memory dc compatible with the paint dccdc memdc;memdc.createcompatibledc( &dc );cbitmap bitmap;cpalette palette;long nwidth;long nheight;  //挪用该因变量getbitmapandpalette("e:\\project\\  showimage\\bitmap1.bmp",bitmap,palette ,  &nwidth,&nheight);memdc.selectobject( &bitmap );// select and realize the paletteif( dc.getdevicecaps(rastercaps) &   rc_palette && palette.m_hobject != null ){  dc.selectpalette( &palette, false );  dc.realizepalette();}//表露位图dc.bitblt(0, 0, nwidth,nheight, &memdc, 0, 0,srccopy);}---- 之上步调不过大略的从一个恒定路途(e:\\project\\showimage\\bitmap1.bmp)装入位图,读者群不妨将其功效夸大,如经过对话框采用之类,在此不多赘述。 ---- 结果还要弥补的一点是,即使要表露的位图是动作位图资源与步调接洽在一道的,对之上步调稍作窜改即可表露出来,窜改本领如次: 开始将getbitmapandpalette()因变量改为:bool  getbitmapandpalette(uint nidresource, cbitmap &bitmap, cpalette &pal,long *w,long *h)个中nidresource是该位图的id。而后将getbitmapandpalette()中的第一句改为: lpctstr lpszresourcename = (lpctstr)nidresource;并将loadimage因变量改为:hbitmap hbmp = (hbitmap)::loadimage( afxgetinstancehandle(),                nidresourcename,image_bitmap,0,0,                         lr_createdibsection); 结果,在onpaint因变量中挪用getbitmapandpalette()时,将位图的id经过nidresource传入即可

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.