BOOL IsValid(); void Destroy(); CDC m_DC; BYTE * m_pBits; int m_ImageSize; int m_WidthBytes; int m_Height; BOOL LoadBmpFile(CString a_Filename); int m_Width; SDImage(); virtual ~SDImage(); protected: HDC m_hMemDC; HBITMAP m_hBitmap; private: HBITMAP m_hOldBitmap; };
#endif
// !defined(AFX_SDIMAGE_H__BA98791A_D437_4687_AAEA_B988391C2FCC__INCLUDED_)
***添加成员变量和成员函数
右键单击左侧类中SDImage类,选择添加成员变量。
右键单击左侧类中SDImage类,选择添加成员函数。
3. 编写类实现代码
打开SDImage.cpp文件,将SDImage类的实现代码添加到该文件中。
(1) 构造及析构函数 SDImage:: SDImage() { m_hBitmap = NULL; m_pBits = NULL; m_hMemDC = NULL; }
SDmage::~ SDmage() { Destroy(); }
(2) 图像空间创建函数
按给定的图像尺寸分配图像的内存空间,并定义相关参数。 BOOL SDImage::Create(int a_Width, int a_Height) { Destroy(); if( a_Width==0 || a_Height==0 ) return FALSE; if( a_Width<0 ) a_Width = -a_Width; if( a_Height<0 ) a_Height = -a_Height;
BITMAPINFO bi; bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bi.bmiHeader.biWidth = a_Width; bi.bmiHeader.biHeight = -a_Height; bi.bmiHeader.biPlanes = 1; bi.bmiHeader.biBitCount = 24; bi.bmiHeader.biCompression = BI_RGB; bi.bmiHeader.biSizeImage = 0; bi.bmiHeader.biXPelsPerMeter = 11810; bi.bmiHeader.biYPelsPerMeter = 11810; bi.bmiHeader.biClrUsed = 0; bi.bmiHeader.biClrImportant = 0; HDC hdc=CreateCompatibleDC(NULL); m_hBitmap
CreateDIBSection(hdc,&bi,DIB_RGB_COLORS,(void**)&m_pBits,NULL,0); DeleteDC(hdc); if( m_hBitmap==NULL || m_pBits==NULL ) { m_hBitmap = NULL; m_pBits = NULL; return FALSE; } BITMAP bm; GetObject(m_hBitmap,sizeof(BITMAP),&bm); m_Width = bm.bmWidth; m_Height = bm.bmHeight; m_WidthBytes = bm.bmWidthBytes; m_ImageSize = m_WidthBytes*m_Height; m_hMemDC = CreateCompatibleDC(NULL); if( m_hMemDC==NULL ) { DeleteObject(m_hBitmap); m_hBitmap = NULL; m_pBits = NULL; m_hMemDC = NULL; return FALSE; } m_hOldBitmap = (HBITMAP)SelectObject(m_hMemDC,m_hBitmap); m_DC.Attach(m_hMemDC); return TRUE; }
=
(3) 图像空间释放函数 void SDImage::Destroy() { }
if( m_hBitmap!=NULL && m_pBits!=NULL && m_hMemDC!=NULL ) { m_DC.Detach(); SelectObject(m_hMemDC,m_hOldBitmap); DeleteDC(m_hMemDC); DeleteObject(m_hBitmap); }
m_hBitmap = NULL; m_pBits = NULL;
m_hMemDC = NULL;
(4) 图像有效性判别及图像复制函数
BOOL SDImage::IsValid() { return ( m_hBitmap!=NULL && m_pBits!=NULL && m_hMemDC!=NULL ); }
BOOL SDImage::CopyFrom(SDImage *a_pImg) { if( a_pImg==NULL || !a_pImg->IsValid() ) return FALSE; if( !Create(a_pImg->m_Width, a_pImg->m_Height) ) return FALSE; memcpy( (void*)m_pBits, (void*)a_pImg->m_pBits, m_WidthBytes*m_Height ); return TRUE; }
(5) 图像显示函数
直接显示,缩放显示,按适合窗口的尺寸显示图像。
BOOL SDImage::BitBlt(HDC a_DestDC, int a_DestX, int a_DestY, int a_Width, int a_Height, int a_SrcX, int a_SrcY, DWORD a_Rop) { return ::BitBlt(a_DestDC, a_DestX, a_DestY, a_Width, a_Height,m_hMemDC, a_SrcX, a_SrcY, a_Rop) }
BOOL SDImage::StretchBlt(HDC a_DestDC, int a_DestX, int a_DestY, int a_DestWidth, int a_DestHeight, int a_SrcX, int a_SrcY, int a_SrcWidth, int a_SrcHeight, DWORD a_Rop)
{ ::SetStretchBltMode(a_DestDC,COLORONCOLOR); return ::StretchBlt(a_DestDC, a_DestX, a_DestY, a_DestWidth, a_DestHeight,m_hMemDC, a_SrcX, a_SrcY, a_SrcWidth, a_SrcHeight, a_Rop); }
(6) Bmp文件读入函数
BOOL SDImage::LoadBmpFile(CString a_Filename) { FILE *pf = fopen(a_Filename,\ if( pf==NULL ) return FALSE; BITMAPFILEHEADER bmfHeader; if ( fread((LPSTR)&bmfHeader,1,sizeof(bmfHeader),pf) != sizeof(bmfHeader) ) { fclose(pf); return FALSE; } if( bmfHeader.bfType != ((WORD)('M'<<8) | 'B') ) { fclose(pf); return FALSE; } int leng = bmfHeader.bfSize - sizeof(bmfHeader); BYTE *pBmp = (BYTE *)calloc(leng,1); if( pBmp == NULL ) { fclose(pf); return FALSE; } if ( (int)fread(pBmp,1,leng,pf) != leng ) { free(pBmp); fclose(pf); return FALSE; } fclose(pf); BYTE *pImg=(BYTE*)(pBmp + bmfHeader.bfOffBits - sizeof(BITMAPFILEHEADER)); BITMAPINFO *pbi; pbi = (BITMAPINFO*)pBmp; if( pbi->bmiHeader.biBitCount != 24 ) { free(pBmp); return FALSE; } int widthBytes = ((pbi->bmiHeader.biWidth*pbi->bmiHeader.biBitCount+31)/32)*4; int i; BYTE *p1,*p2; RGBQUAD *ci = pbi->bmiColors; if( Create( pbi->bmiHeader.biWidth, abs(pbi->bmiHeader.biHeight) ) ) { int bytes = m_WidthBytes;