大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 程序开发 -> BMP位图文件结构及平滑缩放

BMP位图文件结构及平滑缩放

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

西安交通大学流体板滞接洽所张义云   用普遍本领表露bmp位图,占外存大,速率慢,在图形减少时,走样重要,在低脸色位数的摆设上表露高脸色位数的图形图形时走样大。本文华用视频因变量表露bmp位图,不妨取消之上的缺陷。一、bmp文献构造bmp文献构成bmp文献由文献头、位图消息头、脸色消息和图形数据四局部构成。 bmp文献头bmp文献头数据构造含有bmp文献的典型、文献巨细和位图开始场所等消息。 其构造设置如次:typedef struct tagbitmapfileheader{wordbftype; // 位图文献的典型,必需为bmdword bfsize; // 位图文献的巨细,以字节为单元 wordbfreserved1; // 位图文献保持字,必需为0wordbfreserved2; // 位图文献保持字,必需为0dword bfoffbits; // 位图数据的开始场所,以对立于位图// 文献头的偏移量表白,以字节为单元} bitmapfileheader;3. 位图消息头bmp位图消息头数据用来证明位图的尺寸等消息。typedef struct tagbitmapinfoheader{dword bisize; // 本构造所占用字节数longbiwidth; // 位图的宽窄,以像素为单元longbiheight; // 位图的莫大,以像素为单元word biplanes; // 目的摆设的级别,必需为1word bibitcount// 每个像素所需的位数,必需是1(双色),// 4(16色),8(256色)或24(真彩色)之一dword bicompression; // 位图收缩典型,必需是 0(不收缩),// 1(bi_rle8收缩典型)或2(bi_rle4收缩典型)之一dword bisizeimage; // 位图的巨细,以字节为单元longbixpelspermeter; // 位图水等分辨率,每米像素数longbiypelspermeter; // 位图笔直辨别率,每米像素数dword biclrused;// 位图本质运用的脸色表中的脸色数dword biclrimportant;// 位图表露进程中要害的脸色数} bitmapinfoheader;4. 脸色表  脸色表用来证明位图中的脸色,它有几何个表项,每一个表项是一个rgbquad典型的构造,设置一种脸色。rgbquad构造的设置如次:typedef struct tagrgbquad {bytergbblue;// 蓝色的亮度(值范畴为0-255)bytergbgreen; // 绿色的亮度(值范畴为0-255)bytergbred; // 赤色的亮度(值范畴为0-255)bytergbreserved;// 保持,必需为0} rgbquad;脸色表中rgbquad构造数据的个数有bibitcount来决定:当bibitcount=1,4,8时,辨别有2,16,256个表项;当bibitcount=24时,没有脸色表项。位图消息头和脸色表构成位图消息,bitmapinfo构造设置如次:typedef struct tagbitmapinfo {bitmapinfoheader bmiheader; // 位图消息头rgbquad bmicolors[1]; // 脸色表} bitmapinfo;5. 位图数据  位图数据记载了位图的每一个像素值,记载程序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数:当bibitcount=1时,8个像素占1个字节;当bibitcount=4时,2个像素占1个字节;当bibitcount=8时,1个像素占1个字节;当bibitcount=24时,1个像素占3个字节;windows规则一个扫描行所占的字节数必需是4的倍数(即以long为单元),不及的以0弥补,一个扫描行所占的字节数计划本领:datasizeperline= (biwidth* bibitcount+31)/8; // 一个扫描行所占的字节数datasizeperline= datasizeperline/4*4; // 字节数必需是4的倍数位图数据的巨细(不收缩情景下):datasize= datasizeperline* biheight;二、bmp位图普遍表露本领1. 请求外存空间用来寄存位图文献  globalalloc(ghnd,filelength);2. 位图文献读入所请求外存空间中   loadfiletomemory( mpbitssrc,mfilename);3. 在onpaint等因变量顶用创造表露用位图  用createdibitmap()创造表露用位图,用createcompatibledc()创造兼容dc,  用selectbitmap()采用表露位图。4. 用bitblt或stretchblt等因变量表露位图5. 用deleteobject()简略所创造的位图  之上本领的缺陷是: 1)表露速率慢; 2) 外存占用大; 3) 位图在减少表露时图形走样大,(可经过安置字体光滑软硬件来处置); 4) 在低脸色位数的摆设上(如256表露形式)表露高脸色位数的图形(如真彩色)图形走样重要。三、bmp位图缩放表露   用drawdib视频因变量来表露位图,外存占用少,速率快,并且还不妨对图形举行淡化(dithering)处置。淡化处置是一种图形算法,不妨用来在一个扶助比图像所用脸色要少的摆设上表露彩色图像。bmp位图表露本领如次:1. 翻开视频因变量drawdibopen(),普遍放到处结构因变量中2. 请求外存空间用来寄存位图文献  globalalloc(ghnd,filelength);3. 位图文献读入所请求外存空间中----   loadfiletomemory( mpbitssrc,mfilename);4. 在onpaint等因变量顶用drawdibrealize(),drawdibdraw()表露位图5. 封闭视频因变量drawdibclose(),普遍放到处析构因变量中  之上本领的便宜是: 1)表露速率快; 2) 外存占用少; 3) 缩放表露时图形走样小,4) 在低脸色位数的摆设上表露高脸色位数的图形图形时走样小; 5) 经过径直处置位图数据,不妨创造大略动画。四、cviewbimap类编制程序重心1. 在cviewbimap类中增添视频因变量等分子hdrawdib m_hdrawdib; // 视频因变量handlemhbitssrc; // 位图文献句柄(外存)lpstr mpbitssrc; // 位图文献地方(外存)bitmapinfoheader *mpbitmapinfo; // 位图消息头2. 在cviewbimap类结构因变量中增添翻开视频因变量  m_hdrawdib= drawdibopen();3. 在cviewbimap类析构因变量中增添封闭视频因变量if( m_hdrawdib != null){drawdibclose( m_hdrawdib);m_hdrawdib = null;}4. 在cviewbimap类图形表露因变量onpaint中增添graphicdraw()voidcviewbitmap::onpaint(){cpaintdc dc(this); // device context for paintinggraphicdraw( );}voidcviewbitmap::graphicdraw( void ){cclientdc dc(this); // device context for paintingbitmapfileheader *pbitmapfileheader;ulong bfoffbits= 0;cpoint wid;// 图形文献名灵验 (=0 bmp)if( mbitmapfiletype < id_bitmap_bmp ) return;// 图形文献名灵验 (=0 bmp)// 筹备表露真彩位图pbitmapfileheader= (bitmapfileheader *) mpbitssrc;bfoffbits= pbitmapfileheader->bfoffbits;// 运用普遍因变量表露位图if( m_hdrawdib == null || mdispmethod == 0){hbitmap hbitmap=::createdibitmap(dc.m_hdc,mpbitmapinfo, cbm_init, mpbitssrc+bfoffbits,(lpbitmapinfo) mpbitmapinfo,dib_rgb_colors); // 创造位图hdc hmemdc=::createcompatibledc(dc.m_hdc);// 创造外存hbitmap hbitmapold= selectbitmap(hmemdc, hbitmap); // 采用东西// 分子crect mdispr用来引导图形表露地区的巨细.// 分子cpoint mpos用来引导图形表露开始场所坐标.if( mpos.x > (mpbitmapinfo- >biwidth - mdispr.width() ))mpos.x= mpbitmapinfo->biwidth - mdispr.width() ;if( mpos.y > (mpbitmapinfo- >biheight- mdispr.height()))mpos.y= mpbitmapinfo- >biheight- mdispr.height();if( mpos.x < 0 ) mpos.x= 0;if( mpos.y < 0 ) mpos.y= 0;if( mfullviewtog == 0){// 表露真彩位图::bitblt(dc.m_hdc,0,0, mdispr.width(), mdispr.height(),hmemdc,mpos.x,mpos.y, srccopy);} else {::stretchblt(dc.m_hdc,0,0, mdispr.width(), mdispr.height(),hmemdc,0,0, mpbitmapinfo- >biwidth, mpbitmapinfo->biheight, srccopy);}// 中断表露真彩位图::deleteobject(selectobject(hmemdc,hbitmapold)); // 删 除 位 图} else {// 运用视频因变量表露位图if( mpos.x > (mpbitmapinfo- >biwidth - mdispr.width() ))mpos.x= mpbitmapinfo- >biwidth - mdispr.width() ;if( mpos.y > (mpbitmapinfo- >biheight- mdispr.height()))mpos.y= mpbitmapinfo- >biheight- mdispr.height();if( mpos.x < 0 ) mpos.x= 0;if( mpos.y < 0 ) mpos.y= 0;// 表露真彩位图drawdibrealize( m_hdrawdib, dc.getsafehdc(), true);if( mfullviewtog == 0){wid.x= mdispr.width();wid.y= mdispr.height();// 1:1 表露时, 不许大于图形巨细if( wid.x > mpbitmapinfo- >biwidth )wid.x = mpbitmapinfo- >biwidth;if( wid.y > mpbitmapinfo- >biheight)wid.y = mpbitmapinfo- >biheight;drawdibdraw( m_hdrawdib, dc.getsafehdc(), 0, 0, wid.x, wid.y,mpbitmapinfo, (lpvoid) (mpbitssrc+bfoffbits),mpos.x, mpos.y, wid.x, wid.y, ddf_backgroundpal);} else {drawdibdraw( m_hdrawdib, dc.getsafehdc(),0, 0, mdispr.width(), mdispr.height(),mpbitmapinfo, (lpvoid) (mpbitssrc+bfoffbits),0, 0, mpbitmapinfo- >biwidth, mpbitmapinfo- >biheight,ddf_backgroundpal);}}return;}五、运用cviewbimap类表露bmp位图  1. 在visual c++5.0中兴建一个称呼为mymap工程文献,典型为mfc appwizard[exe]。在编写翻译运转经过后,在workspace(如被封闭,用alt_0翻开)点击resourceview,点击menu左侧的+标记打开menu条件,双击idr_mainframe条件,加入菜单资源编纂,在'“察看(v)”下拉式菜单(英文版为view下拉式菜单)的尾部增添“viewbitmap”条件,其id为id_view_bitmap。2. 在visual c++5.0中式点心击下拉式菜单project- >add to project- >files...,将bitmap0.h和bitmap0.cpp增添到工程文献中。3. 在visual c++5.0中按ctrl_w加入mfc classwizard,采用类称呼为cmainframe,objectids: id_view_bitmap,messages采用command,而后点击add fucction按钮,而后输出因变量名为onviewbimap。在增添onviewbimap后,在member functions: 中式点心击onviewbimap条件,点击edit code按钮编纂步调代码。代码如次:void cmainframe::onviewbitmap(){// todo: add your command handler code herecviewbitmap *pviewbitmap= null;pviewbitmap= new cviewbitmap( "bitmap.bmp", this);pviewbitmap- >showwindow( true);}并在该步调的头部增添#include "bitmap0.h",而后编写翻译运转。4. 找一个大学一年级点的真彩色的bmp位图,将它正片到bitmap.bmp中。5. 运转时,点击下拉式菜单“察看(v)- >viewbitmap”(英文版为view- > viewbitmap)即可表露bitmap.bmp位图。六、cviewbimap类功效证明1. 在存户区中带有水宽厚笔直震动条。在位图巨细大于表露存户区时,不妨运用震动条;在位图巨细小于表露存户区或全屏表露时,震动条失效。2. 在存户区中底部带有状况条。状况条中的第一格为位图消息,第二格为位图表露本领,不妨是运用普遍因变量或运用视频因变量。在第二格地区内点击鼠标,可在两者之转弯抹角换。第三格为位图表露比率,不妨是1;1表露或全屏表露。在第三格地区内点击鼠标,可在两者之转弯抹角换。在全屏表露时,即使位图比存户区小,则对位图夸大; 即使位图比存户区大,则对位图减少。3. 扶助文献拖放功效。不妨从资源处置器中拖动一个位图文献到存户区,就不妨表露该位图。  步调调节和测试经过后,不妨找一个较大的真彩色位图或安排存户区比位图小,在全屏表露办法下,比拟运用普遍因变量与运用视频因变量的分辨。不妨看出,位图夸大时两者分辨不大,但在位图减少时,两者分辨鲜明; 运用视频因变量时位图走样小,表露速率快。  还不妨从遏制面板中将屏幕表露办法从真彩色表露形式切换到256色表露形式,再比拟运用普遍因变量与运用视频因变量表露同一个真彩色位图的分辨。此刻不妨领会到运用视频因变量的出色性了吧。  在全屏表露时,位图的xy目标比率不沟通,如要维持沟通比率,可在表露步调中加以符合安排即可,读者群可自行实行。

热门阅览

最新排行

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