使用c++ SDK中的类(Graphics,Image)加载图片
c++, mfc加载图片jpg,png,gif格式
前言
使用gdi+类加载图片(jpg,png,gif)
(定义两个变量:GdiplusStartupInput param1; ULONG_PTR param2;)
需要先在构造函数初始化库:调用GdiplusStartup(¶m1,¶m2,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;
//要在一个定时器中调用此函数,不停的绘制(以上方法仅供参考)
}
总结
以上方法仅供参考