计算机图形图像实验一

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档