计算机图形图像实验一

上传人:F****n 文档编号:100170096 上传时间:2019-09-22 格式:DOC 页数:10 大小:71KB
返回 下载 相关 举报
计算机图形图像实验一_第1页
第1页 / 共10页
计算机图形图像实验一_第2页
第2页 / 共10页
计算机图形图像实验一_第3页
第3页 / 共10页
计算机图形图像实验一_第4页
第4页 / 共10页
计算机图形图像实验一_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《计算机图形图像实验一》由会员分享,可在线阅读,更多相关《计算机图形图像实验一(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

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号