VC 数字图像处理实验(VC 单文档)(3)

2019-04-01 17:43

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;


VC 数字图像处理实验(VC 单文档)(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:牛津初中英语8B - Unit6 - A - charity - walk学习案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: