计算机图形图像实验一
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
位图的读取与显示
物联一班谢鑫123
1. 实验目的
通过位图文件的解析,进一步理解位图文件的格式;熟悉Windows环境下图片的显示方式。
2. 实验内容
在Windows环境下,通过解析位图文件的格式,读入位图并进行显示,不能使用Windows中已有的API(如LoadImage函数)读取位图文件,即自己实现LoadImage函数的功能:
LoadImage(NULL, “lenna.bmp”, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE)三、实验原理及步骤:
基本知识:BMP位图文件格式
BMP位图文件中主要由4部分内容组成:
1、文件头BITMAPFILEHEADER为一STRUCTURE:
typedef struct tagBITMAPFILEHEADER {
WORD bfType;//文件类型,必须为“BM”或0x424d
DWORD bfSize;//文件大小
WORD bfReserved1;//保留
WORD bfReserved2;//保留
DWORD bfOffBits;//从文件头到实际位图数据的偏移字节数
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
2、位图信息头BITMAPINFOHEADER,定义如下:
typedef struct tagBITMAPINFOHEADER{
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;//
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个像素。对于用到调色板的位图,图像数据就是该像素颜色在调色板中索引值,对于真彩色,不用调色板,三个字节的数据分别代表图像的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;
HBITMAP 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中选择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_DibHead->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;