《计算机图形图像实验一》由会员分享,可在线阅读,更多相关《计算机图形图像实验一(10页珍藏版)》请在金锄头文库上搜索。
1、位图的读取与显示 物联一班 谢鑫 1. 实验目的通过位图文件的解析,进一步理解位图文件的格式;熟悉Windows环境下图片的显示方式。2. 实验内容在Windows环境下,通过解析位图文件的格式,读入位图并进行显示,不能使用Windows中已有的API(如LoadImage函数)读取位图文件,即自己实现LoadImage函数的功能:LoadImage(NULL, “lenna.bmp”, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE)三、实验原理及步骤:基本知识:BMP位图文件格式BMP位图文件中主要由4部分内容组成:1、 文件头BITMAPFILEHEADER为一S
2、TRUCTURE:typedef struct tagBITMAPFILEHEADER WORD bfType;/文件类型,必须为“BM”或0x424d DWORD bfSize;/文件大小 WORD bfReserved1;/保留 WORD bfReserved2;/保留 DWORD bfOffBits;/从文件头到实际位图数据的偏移字节数 BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;2、 位图信息头BITMAPINFOHEADER,定义如下:typedef struct tagBITMAPINFOHEADER
3、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 biClrUsed;/
4、DWORD biClrImportant; BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;3、 调色板typedef struct tagRGBQUAD BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed;BYTE rgbReserved; RGBQUAD;用于存放图像的颜色。4、 图像的实际数据。对于2色图,用1位表示像素的值。对于16色图,用4位表示像素的值。对于256色图,一个字节刚好表示1个像素。对于用到调色板的位图,图像数据就是该像素颜色在调色板中索引值,对于真彩色,不用调色板
5、,三个字节的数据分别代表图像的B、G、R。实验步骤:1、 生成一名为Gsm的基于MFC的应用程序框架:选择file菜单new选项,在打开的窗口中选择project选项,选中MFC AppWizard(exe)。并在project name输入Gsm ,选择存放project的位置。如下图所示。选择确定,进入下一步。选择single document,并在最后CdipView类的基类中选择CscrollView,使应用程序视图具有滚动条。2、 在应用程序中加入具体的函数和变量。在Class View中选择CGsmView单击右键选择添加成员变量,加入下列变量:public:int m_x;HBI
6、TMAP m_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中
7、选择CGsmView单击右键选择添加成员函数,把下列函数加入到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();3、 把对应函数代码拷贝到新的函数中;void CGsmView:SetPaletteSize(int nBitCount)if(m_Di
8、bHead-biSize != 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_DibHea
9、d-biHeight; 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_
10、nPalette = m_DibHead-biClrUsed;ASSERT(m_nPalette = 0) & (m_nPalette Read(LPVOID) &bmfh, sizeof(BITMAPFILEHEADER);if(nCount != sizeof(BITMAPFILEHEADER) throw new CException;if(bmfh.bfType != 0x4d42) throw new CException;nSize = bmfh.bfOffBits - sizeof(BITMAPFILEHEADER);m_DibHead = (LPBITMAPINFOHEADER
11、) new charnSize;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;return TRUE;BOOL CGsmView:SetPalette()if(m_nPalette