计算机图形图像实验一_第1页
计算机图形图像实验一_第2页
计算机图形图像实验一_第3页
计算机图形图像实验一_第4页
计算机图形图像实验一_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、位图的读取与显示 物联一班 谢鑫 201007401231. 实验目的通过位图文件的解析,进一步理解位图文件的格式;熟悉Windows环境下图片的显示方式。2. 实验内容在Windows环境下,通过解析位图文件的格式,读入位图并进行显示,不能使用Windows中已有的API(如LoadImage函数)读取位图文件,即自己实现LoadImage函数的功能:LoadImage(NULL, “lenna.bmp”, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE)三、实验原理及步骤:基本知识:BMP位图文件格式BMP位图文件中主要由4部分内容组成:文件头BITMAPFILEH

2、EADER为一STRUCTURE:typedef struct tagBITMAPFILEHEADER WORD bfType;/文件类型,必须为“BM”或0 x424d DWORD bfSize;/文件大小 WORD bfReserved1;/保留 WORD bfReserved2;/保留 DWORD bfOffBits;/从文件头到实际位图数据的偏移字节数 BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;位图信息头BITMAPINFOHEADER,定义如下:typedef struct tagBITMAPINFOH

3、EADER DWORD biSize;/structure size LONG biWidth;/image width LONG biHeight;/image height WORD biPlanes;/value is 1 WORD biBitCount;/color bits DWORD biCompression;/compression or not DWORD biSizeImage;/Image size=width*height( 其中width必须为4的倍数。 LONG biXPelsPerMeter;/ LONG biYPelsPerMeter; DWORD biClrU

4、sed;/ DWORD biClrImportant; BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;调色板typedef struct tagRGBQUAD BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed;BYTE rgbReserved; RGBQUAD;用于存放图像的颜色。图像的实际数据。对于2色图,用1位表示像素的值。对于16色图,用4位表示像素的值。对于256色图,一个字节刚好表示1个像素。对于用到调色板的位图,图像数据就是该像素颜色在调色板中索引值,对于真彩色,不用调色板

5、,三个字节的数据分别代表图像的B、G、R。实验步骤:生成一名为Gsm的基于MFC的应用程序框架:选择file菜单new选项,在打开的窗口中选择project选项,选中MFC AppWizard(exe)。并在project name输入Gsm ,选择存放project的位置。如下图所示。选择确定,进入下一步。选择single document,并在最后CdipView类的基类中选择CscrollView,使应用程序视图具有滚动条。在应用程序中加入具体的函数和变量。在Class View中选择CGsmView单击右键选择添加成员变量,加入下列变量:public:int m_x;HBITMAP m

6、_Bmp;LPVOID m_ColorList;LPBYTE m_Image;LPBITMAPINFOHEADER m_DibHead; enum allocate None, crtallocate, heapallocate;allocate m_nBmpallocate;allocate m_nImageallocate;DWORD m_ImageSize; int m_nPalette;HANDLE m_hFile;HANDLE m_hMap;LPVOID m_lpvFile;HPALETTE m_hPalette;HGLOBAL m_hGlob; 在Class View中选择CGsm

7、View单击右键选择添加成员函数,把下列函数加入到C+View类中void SetPaletteSize(int nBitCount);void Clear();BOOL ReadFile(CFile *pFile);BOOL SetPalette();BOOL GetPalette();BOOL DibToDC(CDC* pDC,CSize size);BOOL MemToDib(LPVOID lmem);CSize GetDibSize();把对应函数代码拷贝到新的函数中;void CGsmView:SetPaletteSize(int nBitCount)if(m_DibHead-biS

8、ize != sizeof(BITMAPINFOHEADER) throw new CException;m_ImageSize = m_DibHead-biSizeImage;if(m_ImageSize = 0) DWORD dwBytes = (DWORD) m_DibHead-biWidth * m_DibHead-biBitCount) / 32;if(DWORD) m_DibHead-biWidth * m_DibHead-biBitCount) % 32)dwBytes+;dwBytes *= 4;m_ImageSize = dwBytes * m_DibHead-biHeigh

9、t; m_ColorList = (LPBYTE) m_DibHead + sizeof(BITMAPINFOHEADER);if(m_DibHead = NULL) | (m_DibHead-biClrUsed = 0) switch(nBitCount) case 1:m_nPalette = 2;break;case 4:m_nPalette = 16;break;case 8:m_nPalette = 256;break;case 16:case 24:case 32:m_nPalette = 0;break;default:ASSERT(FALSE);else m_nPalette

10、= m_DibHead-biClrUsed;ASSERT(m_nPalette = 0) & (m_nPalette Read(LPVOID) &bmfh, sizeof(BITMAPFILEHEADER);if(nCount != sizeof(BITMAPFILEHEADER) throw new CException;if(bmfh.bfType != 0 x4d42) throw new CException;nSize = bmfh.bfOffBits - sizeof(BITMAPFILEHEADER);m_DibHead = (LPBITMAPINFOHEADER) new ch

11、arnSize;m_nBmpallocate = m_nImageallocate = crtallocate;nCount = pFile-Read(m_DibHead, nSize); SetPaletteSize(m_DibHead-biBitCount);GetPalette();m_Image = (LPBYTE) new charm_ImageSize;nCount = pFile-Read(m_Image, m_ImageSize); catch(CException* tmpc) AfxMessageBox(文件读取错误);tmpc-Delete();return FALSE;

12、return TRUE;BOOL CGsmView:SetPalette()if(m_nPalette!=0)return FALSE;CClientDC dc(this);CDC *pDC=&dc;m_hPalette=:CreateHalftonePalette(pDC-GetSafeHdc();return TRUE;BOOL CGsmView:GetPalette()if(m_nPalette=0)return FALSE;if(m_hPalette!=NULL):DeleteObject(m_hPalette);LPLOGPALETTE pTempPalette=(LPLOGPALE

13、TTE) new char2*sizeof(WORD)+ m_nPalette*sizeof(PALETTEENTRY); pTempPalette-palVersion=0 x30;pTempPalette-palNumEntries=m_nPalette;LPRGBQUAD pRGBQuad=(LPRGBQUAD)m_ColorList;for(int i=0;ipalPalEntryi.peRed=pRGBQuad-rgbRed;pTempPalette-palPalEntryi.peGreen=pRGBQuad-rgbGreen;pTempPalette-palPalEntryi.pe

14、Blue=pRGBQuad-rgbBlue;pTempPalette-palPalEntryi.peFlags=0;pRGBQuad+;m_hPalette=:CreatePalette(pTempPalette);delete pTempPalette;return TRUE;BOOL CGsmView:DibToDC(CDC *pDC, CSize size)if(m_DibHead=NULL) return FALSE;if(m_hPalette!=NULL)HDC hdc=pDC-GetSafeHdc();:SelectPalette(hdc,m_hPalette,TRUE);pDC-

15、SetStretchBltMode(COLORONCOLOR);:StretchDIBits(pDC-GetSafeHdc(),0,0,size.cx,size.cy, 0,0,m_DibHead-biWidth,m_DibHead-biHeight, m_Image,(LPBITMAPINFO)m_DibHead,DIB_RGB_COLORS, SRCCOPY); return TRUE;BOOL CGsmView:MemToDib(LPVOID lmem)Clear();m_DibHead=(LPBITMAPINFOHEADER)lmem;SetPaletteSize(m_DibHead-

16、biBitCount);m_Image=(LPBYTE)m_ColorList+sizeof(RGBQUAD)*m_nPalette;GetPalette();return TRUE;CSize CGsmView:GetDibSize()if(m_DibHead=NULL) return CSize(0,0);return CSize(int)m_DibHead-biWidth,(int)m_DibHead-biHeight);编译检验没有出现错误;在程序资源中创建位图条为默认;修改OnInitialUpdate函数中的代码;void CGsmView:OnInitialUpdate() CS

17、crollView:OnInitialUpdate();m_x=25;CSize MaxSize(24000,32000);CSize MinSize(MaxSize.cx/100,MaxSize.cy/100);SetScrollSizes(MM_HIMETRIC,MaxSize,MaxSize,MinSize);LPVOID lFirstBMP=(LPVOID):LoadResource(NULL,:FindResource(NULL,MAKEINTRESOURCE(IDB_BITMAP1),RT_BITMAP);MemToDib(lFirstBMP);修改OnDraw函数中的代码;voi

18、d CGsmView:OnDraw(CDC* pDC)CGsmDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);BeginWaitCursor(); CSize DibSize = GetDibSize(); DibSize.cx *= m_x; DibSize.cy *= -m_x; DibToDC(pDC, DibSize); EndWaitCursor();建立打开文件的消息响应函数在Menu中打开菜单编辑窗口,单击“文件”,在下拉菜单中选中“打开”,右键单击,在弹出菜单中选择“类向导”并打开。在类名中选择classview单击COMMAND,单击Addfunction建立消息响应函数OnFileOpen(),并加入入下代码: void CGsmView:OnFileOpen() / TODO: Add your command handler code hereCFileDialog filedlg(TRUE,b

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论