MFC之基于Gdiplus的图像类

来源:互联网 发布:苏州淘宝运营工作内容 编辑:程序博客网 时间:2024/04/29 07:05

这是一个基于Gdiplus的图像类,在进行这个类的创建前,需要做好如下准备工作:

(1)在stdafx.h中添加如下代码

        #include <GdiPlus.h>
using namespace Gdiplus;

#pragma comment(lib,"Gdiplus.lib")

#define SafeDelete(pData){ try{ delete pData;} catch (...){ASSERT(FALSE);} pData=NULL;}
#define SafeRelease(pObject){ if (pObject!=NULL) {pObject->Release();pObject=NULL;}}

(2)在app中添加一个类成员变量

protected:ULONG_PTR m_GdiplusToken;

(3)初始化m_GdiplusToken=NULL;

(4)在InitInstance()中添加如下代码:

GdiplusStartupInput input;
GdiplusStartup(&m_GdiplusToken,&input,NULL);  

(5)释放资源,添加函数如下:

int CMusicApp::ExitInstance(){if(m_GdiplusToken)GdiplusShutdown(m_GdiplusToken);return CWinApp::ExitInstance();}

关于几个API函数

(1)FindResource

函数功能:该函数确定指定模块中指定类型和名称的资源所在位置。
函数原型:HRSRC FindResource(HMODULE hModule,LPCTSTR lpName,LPCTSTR lpType);
hModule:处理包含资源的可执行文件的模块。NULL值则指定模块句柄指向操作系统通常情况下创建最近过程的相关位图文件。
lpName:指定资源名称。若想了解更多的信息,请参见注意部分。
lpType:指定资源类型。若想了解更多的信息,请参见注意部分。作为标准资源类型。这个参数的含义同EnumResLangProc\lpType。
返回值:如果函数运行成功,那么返回值为指向被指定资源信息块的句柄。为了获得这些资源,将这个句柄传递给LoadResource函数。如果函数运行失败,则返回值为NULL。若想获得更多错误信息,请调用GetLastError函数。

CreateStreamOnHGlobal函数从指定内存创建流对象。
函数原型:
WINOLEAPI CreateStreamOnHGlobal(
HGLOBAL hGlobal, //由GlobalAlloc函数分配的内存句柄。
BOOL fDeleteOnRelease, // 释放标志
LPSTREAM *ppstm // IStream指针的地址,该指针在该函数执行后指向新创建的流对象。该参数不能为NULL。
);
如果函数创建流对象成功则返回S_OK。
#ifndef IMAGE_HEAD_FILE#define IMAGE_HEAD_FILE#pragma onceclass CImageEx{public:CImageEx();~CImageEx();protected:Image * m_pImage;//图片对象TCHAR m_strImageName[MAX_PATH];//图片名称public:bool IsNull();//是否加载INT GetWidth();//获取宽度INT GetHeight();//获取高度public:bool DestoryImage();//销毁图片bool LoadImage(LPCTSTR pszFileName);//加载图片bool LoadImage(HINSTANCE hInstance,LPCTSTR pszResourceName);//加载图片public:bool DrawImage(CDC *pDC,INT nXPos,INT nYPos);//画图bool DrawImage(CDC *pDC,INT nXPos,INT nYPos,INT nDestWidth,INT nDestHeight);bool DrawImage(CDC *pDC,INT nXDest,INT nYDest,INT nDestWidth,INT nDestHeight,INT nXScr,INT nYScr);bool DrawImage(CDC *pDC,INT nXDest,INT nYDest,INT nDestWidth,INT nDestHeight,INT nXScr,INT nYScr,INT nSrcWidth,INT nSrcHeight);public://混合画图bool AlphaDrawImage(CDC * pDestDC,INT xDest,int yDest,BYTE cbAlphaDepth);bool AlphaDrawImage(CDC * pDestDC,INT xDest,int yDest,INT cxDest,INT cyDest,INT xSrc,INT ySrc,BYTE cbAlphaDepth);bool AlphaDrawImage(CDC * pDestDC,INT xDest,int yDest,INT cxDest,INT cyDest,INT xSrc,INT ySrc,INT cxSrc,INT cySrc,BYTE cbAlphaDepth);};
CImageEx::CImageEx(){m_pImage=NULL;ZeroMemory(m_strImageName,sizeof(m_strImageName));return ;}CImageEx::~CImageEx(){DestoryImage();return;}bool CImageEx::IsNull(){if(m_pImage==NULL)return true;if(m_pImage->GetLastStatus()!=Ok)return true;return false;}INT CImageEx::GetWidth(){ASSERT(IsNull()==false);if(IsNull()==true) return 0;return m_pImage->GetWidth();}INT CImageEx::GetHeight(){ASSERT(IsNull()==false);if(IsNull()==true) return 0;return m_pImage->GetHeight();}bool CImageEx::DestoryImage(){if(m_pImage!=NULL)SafeDelete(m_pImage);return true;}bool CImageEx::LoadImage(LPCTSTR pszFileName){ASSERT(m_pImage==NULL);//断言  加载判断if(m_pImage!=NULL)return false;CT2CW strFileName(pszFileName);//把lpctstr转化为lpcwstrm_pImage=Image::FromFile((LPCWSTR)strFileName);//加载文件//错误判断if((m_pImage==NULL)||(m_pImage->GetLastStatus()!=Ok)){DestoryImage();return false;}return true;}bool CImageEx::LoadImage(HINSTANCE hInstance,LPCTSTR pszResourceName){ASSERT(m_pImage==NULL);if(m_pImage!=NULL)return false;//查找资源HRSRC hResource=FindResource(hInstance,pszResourceName,TEXT("IMAGE"));if(hResource==NULL)return false;//读取资源DWORD dwImageSize=SizeofResource(hInstance,hResource);LPVOID pImageBuffer=LoadResource(hInstance,hResource);//创建数据IStream * pIStream=NULL;if(CreateStreamOnHGlobal(NULL,TRUE,&pIStream)!=S_OK){ASSERT(FALSE);return false;}//写入数据pIStream->Write(pImageBuffer,dwImageSize,NULL);//创建位图m_pImage=Image::FromStream(pIStream);//释放资源SafeRelease(pIStream);//资源释放if ((m_pImage==NULL)||(m_pImage->GetLastStatus()!=Ok)){ASSERT(FALSE);return false;}return true;}bool CImageEx::DrawImage(CDC *pDC,INT nXPos,INT nYPos){ASSERT(m_pImage!=NULL);if(m_pImage==NULL)return false;//创建屏幕ASSERT(pDC!=NULL);Graphics graphics(pDC->GetSafeHdc());//获取属性INT nImageWidth=m_pImage->GetWidth();INT nImageHeight=m_pImage->GetHeight();//构造位置RectF rcDrawRect;rcDrawRect.X=(REAL)nXPos;rcDrawRect.Y=(REAL)nYPos;rcDrawRect.Width=(REAL)nImageWidth;rcDrawRect.Height=(REAL)nImageHeight;graphics.DrawImage(m_pImage,rcDrawRect,0,0,(REAL)nImageWidth,(REAL)nImageHeight,UnitPixel);    return true;}bool CImageEx::DrawImage(CDC *pDC,INT nXPos,INT nYPos,INT nDestWidth,INT nDestHeight){ASSERT(m_pImage!=NULL);if(m_pImage==NULL)return false;//创建屏幕ASSERT(pDC!=NULL);Graphics graphics(pDC->GetSafeHdc());//构造位置RectF rcDrawRect;rcDrawRect.X=(REAL)nXPos;rcDrawRect.Y=(REAL)nYPos;rcDrawRect.Width=(REAL)nDestWidth;rcDrawRect.Height=(REAL)nDestHeight;graphics.DrawImage(m_pImage,rcDrawRect,0,0,(REAL)GetWidth(),(REAL)GetHeight(),UnitPixel);return true;}bool CImageEx::DrawImage(CDC *pDC,INT nXDest,INT nYDest,INT nDestWidth,INT nDestHeight,INT nXScr,INT nYScr){ASSERT(m_pImage!=NULL);if(m_pImage==NULL)return false;//创建屏幕ASSERT(pDC!=NULL);Graphics graphics(pDC->GetSafeHdc());//构造位置RectF rcDrawRect;rcDrawRect.X=(REAL)nXDest;rcDrawRect.Y=(REAL)nYDest;rcDrawRect.Width=(REAL)nDestWidth;rcDrawRect.Height=(REAL)nDestHeight;graphics.DrawImage(m_pImage,rcDrawRect,(REAL)nXScr,(REAL)nYScr,(REAL)nDestWidth,(REAL)nDestHeight,UnitPixel);return true;}bool CImageEx::DrawImage(CDC *pDC,INT nXDest,INT nYDest,INT nDestWidth,INT nDestHeight,INT nXScr,INT nYScr,INT nSrcWidth,INT nSrcHeight){ASSERT(m_pImage!=NULL);if(m_pImage==NULL)return false;//创建屏幕ASSERT(pDC!=NULL);Graphics graphics(pDC->GetSafeHdc());//构造位置RectF rcDrawRect;rcDrawRect.X=(REAL)nXDest;rcDrawRect.Y=(REAL)nYDest;rcDrawRect.Width=(REAL)nDestWidth;rcDrawRect.Height=(REAL)nDestHeight;graphics.DrawImage(m_pImage,rcDrawRect,(REAL)nXScr,(REAL)nYScr,(REAL)nSrcWidth,(REAL)nSrcHeight,UnitPixel);return true;}bool CImageEx::AlphaDrawImage(CDC * pDestDC,INT xDest,int yDest,BYTE cbAlphaDepth){AlphaDrawImage(pDestDC,xDest,yDest,GetWidth(),GetHeight(),0,0,cbAlphaDepth);return true;}bool CImageEx::AlphaDrawImage(CDC * pDestDC,INT xDest,int yDest,INT cxDest,INT cyDest,INT xSrc,INT ySrc,BYTE cbAlphaDepth){ASSERT(m_pImage!=NULL);if(m_pImage==NULL)return false;//创建屏幕ASSERT(pDestDC!=NULL);Graphics graphics(pDestDC->GetSafeHdc());//构造位置RectF rcDrawRect;rcDrawRect.X=(REAL)xDest;rcDrawRect.Y=(REAL)yDest;rcDrawRect.Width=(REAL)cxDest;rcDrawRect.Height=(REAL)cyDest;//透明矩阵ColorMatrix Matrix={1.0f,0.0f,0.0f,0.0f,0.0f, 0.0f,1.0f,0.0f,0.0f,0.0f, 0.0f,0.0f,1.0f,0.0f,0.0f,0.0f,0.0f,0.0f,cbAlphaDepth/255.0f,0.0f, 0.0f,0.0f,0.0f,0.0f,1.0f};//设置属性ImageAttributes Attributes;Attributes.SetColorMatrix(&Matrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap); //绘画图像graphics.DrawImage(m_pImage,rcDrawRect,(REAL)xSrc,(REAL)ySrc,(REAL)cxDest,(REAL)cyDest,UnitPixel,&Attributes);}bool CImageEx::AlphaDrawImage(CDC * pDestDC,INT xDest,int yDest,INT cxDest,INT cyDest,INT xSrc,INT ySrc,INT cxSrc,INT cySrc,BYTE cbAlphaDepth){if ((cxDest!=cxSrc)||(cyDest!=cySrc)){ASSERT(m_pImage!=NULL);if(m_pImage==NULL)return false;//创建屏幕ASSERT(pDestDC!=NULL);Graphics graphics(pDestDC->GetSafeHdc());//构造位置RectF rcDrawRect;rcDrawRect.X=(REAL)xDest;rcDrawRect.Y=(REAL)yDest;rcDrawRect.Width=(REAL)cxDest;rcDrawRect.Height=(REAL)cyDest;//透明矩阵ColorMatrix Matrix={1.0f,0.0f,0.0f,0.0f,0.0f, 0.0f,1.0f,0.0f,0.0f,0.0f, 0.0f,0.0f,1.0f,0.0f,0.0f,0.0f,0.0f,0.0f,cbAlphaDepth/255.0f,0.0f, 0.0f,0.0f,0.0f,0.0f,1.0f};//设置属性ImageAttributes Attributes;Attributes.SetColorMatrix(&Matrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap); //绘画图像graphics.DrawImage(m_pImage,rcDrawRect,(REAL)xSrc,(REAL)ySrc,(REAL)cxDest,(REAL)cyDest,UnitPixel,&Attributes);}else{AlphaDrawImage(pDestDC,xDest,yDest,cxDest,cyDest,xSrc,ySrc,cbAlphaDepth);}return true;}





0 0
原创粉丝点击