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
- MFC之基于Gdiplus的图像类
- gdiplus图像库的使用
- VC使用gdiplus加载图像的方法
- 一个基于GDIplus的Gif显示控件
- GDIPlus灰度化图像
- [GDI+] 基于GDIPlus的文本特效渲染:打字效果
- 基于MFC SDI的图像处理程序(带效果图)
- 基于VTK和MFC的医学图像三维重建
- 基于MFC的OpenCV显示文件夹内图像
- 基于MFC的OpenCV图像显示并标定ROI区域
- 基于MFC和OpenCV的图像处理小软件
- 基于MFC和OpenCV的图像标注工具
- flowerboard游戏MFC+GDIPLUS实现
- MFC之基于对话框的Win32程序
- 图像处理之基于像素的图像混合
- 图像处理之基于高斯金字塔的图像融合
- gdiplus.h的引用
- 新的 GdiPlus
- 16个超棒的国外免费PSD资源素材网站推荐
- 黑马程序员_object c学习日记④_内存管理二:@property参数强化、@class及autorelease
- 一种简单实用的双向电平转换电路(非常实用!)3.3V--5V
- 使用Github存储自己的项目代码
- 【每日一C之十】const与define区别
- MFC之基于Gdiplus的图像类
- 02.ServletConfig笔记
- Android打开系统相册的问题
- 排序总结之基数排序
- 数据结构之栈的实现
- Java虚拟机(一)
- hdu 2057A + B Again(十六进制或者八进制的A+B)
- QT 数据操 作
- fzu 2107 Hua Rong Dao(状压dp)