为了能够自己实现一些图像处理的算法,所以需要得到图像的数据并能够显示。
图片要使用bmp位图,结构简单而且windows支持很多操作。为了方便所以先使用24位真彩色位图,这种位图没有调色板。
一般画图是在视类的OnDraw中画图,使用StretchDIBits将图像数据直接贴到窗口上。StretchDIBits的第一个参数是HDC的对象。可以直接使用OnDraw的pDC参数中的m_hdc成员。为了更好的显示效果,用CMemDC类来画图,这个类可以实现一个双缓存机制。
CMemDC memDC(*pDC, this);
CDC &dc = memDC.GetDC();
首先打开位图
CFile file;
file.Open(_T("1.bmp"), CFile::modeRead)
读取位图文信和位图信息头
BITMAPFILEHEADER bitFileHead;
file.Read(&bitFileHead, sizeof(BITMAPFILEHEADER));
BITMAPINFOHEADER bitInfoHead;
file.Read(&bitInfoHead, sizeof(BITMAPINFOHEADER));
按理说BITMAPINFOHEADER 中的biSizeImage应该保存了位图大小的,但实际上数值为0,很奇怪。所以接下来读取位图数据就使用bitWidth和bitHeight两个参数,由于是24位真彩色,所以要乘以3。
BYTE *data;
data = new BYTE[bitInfoHead.biWidth*bitInfoHead.biHeight*3];
file.Read(data, bitInfoHead.biWidth*bitInHeight*3);
接下来画图:
if (data != NULL)
{
BYTE *pHeader = data;
int nWidth = bitInfoHead.biWidth;
int nHeight = bitInfoHead.biHeight;
StretchDIBits(dc.m_hDC, 0, 0, nWidth, nHeight, 0, 0,nWidth,nHeight,
pHeader, (LPBITMAPINFO)&bitInfoHead, DIB_RGB_COLORS, SRCCOPY);
}