使用c++ SDK中的类(Graphics,Image)加载图片

c++, mfc加载图片jpg,png,gif格式

前言

使用gdi+类加载图片(jpg,png,gif)

(定义两个变量:GdiplusStartupInput param1; ULONG_PTR param2;)
需要先在构造函数初始化库:调用GdiplusStartup(&param1,&param2,NULL); 对应析构函数 GdiplusShutdown(param2);

提示:以下是本篇文章正文内容,下面案例可供参考

1 可以用以下示例中自定义的函数LoadImageFromResource()从资源文件中加载一张图片,构造出一个Image(也可以从文件中加载;使用Image::FromFile); 然后使用Graphics类绘制:

Graphics graph(CDC* ); //需要传入一个设备CDC
graph.DrawImage(); //参数省略参考MSDN说明文档(可以在指定位置绘制指定大小和指定图片区域的图片)。

2 对于Bitmap(位图) 和ico(图标)类型图片,无法使用以上方法
对于ico 可以使用以下方法
HICON hIcon;
hIcon = (HICON)::LoadImage(::AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON),IMAGE_ICON,128,128,0);
Bitmap pBitmap = Bitmap::FromHICON(hIcon);

IDI_ICON为图标资源ID
::LoadImage函数可以加载自定义大小的图标,然后构造Gdiplus类中的Bitmap对象(继承自Image)
再使用 Graphics::DrawImage 绘制出来

3 对于Bitmap位图可以使用CImage类,操作更简单:
使用CImage中的LoadFromResource(HINSTANCE hInstance, UINT nIDResource);(只能加载位图)
然后使用CImage::Draw()绘制 //参数省略参考MSDN说明文档

4.对于Gif图片可以使用Image类中的函数(详细见代码示例)

二、使用步骤

1.引入库

代码如下(示例):

Image* LoadImageFromResource( int nID,LPCTSTR pStrType )
{
	Image *pImage = NULL;
	char	 *m_pAllocBuffer  = NULL;				//最好定义成全局变量
	HMODULE hMoudle = GetModuleHandle(NULL);
	HRSRC hRsc = ::FindResource(hMoudle ,MAKEINTRESOURCE(nID),pStrType);
	
	if (hRsc)
	{
		DWORD dwSize    = ::SizeofResource(hMoudle,hRsc);
		HGLOBAL hGloble = ::LoadResource(hMoudle,hRsc);
		char *pResource	= (char*)::LockResource(hGloble);
		m_pAllocBuffer = (char*)::GlobalAlloc(GPTR,dwSize);
		memcpy(m_pAllocBuffer,pResource,dwSize);
		IStream *pStream = NULL;
		CreateStreamOnHGlobal(m_pAllocBuffer,TRUE,&pStream);
		if (pStream)
		{
		    pImage = Image::FromStream(pStream);
		}
		pStream->Release();
		FreeResource(hRsc);
	}
	return pImage;
}

绘制Gif方法如下:

//定义一个类
class CDrawGifImage
{
public:
	CDrawGifImage();
	~CDrawGifImage(void);
	
void LoadGifImage();			//初始化
void DrawGifImage(CDC* pDc);		//绘制函数
private:
	Image	*m_pGifImage;		Gif
	GUID	*m_pGuid;			//每一帧数据
	int	 	m_nFrameCount;		//帧总数量
	int	 	m_nIndex;		//当前帧下标
	char*	 m_pAllocBuffer;		//动态分配的Buff
};

//类实现:
void CDrawGifImage::LoadGifImage()
{
	m_pGifImage = new Image("gif图片路径");  //也可以从资源文件加载
	int DimensionsCount = m_pGifImage->GetFrameDimensionsCount();	  //获取维度
	m_pGuid = new GUID[DimensionsCount];
	m_pGifImage->GetFrameDimensionsList(m_pGuid,DimensionsCount );	//获取所有帧数据
	m_nFrameCount = m_pGifImage->GetFrameCount(m_pGuid);		//获取gif帧数
	m_nIndex = 0;
}

//绘制Gif
void CDrawGifImage::DrawGifImage(CDC* pDc)
{
	CBitmap bitmap;
	CDC *pMemDc = new CDC;
	pMemDc->CreateCompatibleDC(pDc);	
	bitmap.CreateCompatibleBitmap(pDc,m_prcDraw->Width(),m_prcDraw->Height());
	pMemDc->SelectObject(&bitmap);	//	构建内存DC防止闪烁
	//开始绘制
	Graphics graphc(pMemDc->m_hDC);
	graphc.DrawImage(m_pGifImage);	//(省略了部分参数 参考MSDN文档)
	pDc->BitBlt();			//(省略了部分参数 参考MSDN文档)	
	m_pBkImage->SelectActiveFrame(m_pGuid,m_nIndex++);	//选择下一帧
	if (m_nIndex == m_nFrameCount)
	{
		m_nIndex = 0;
	}
	delete pMemDc;
	//要在一个定时器中调用此函数,不停的绘制(以上方法仅供参考)
}

总结

以上方法仅供参考

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐