您的位置:首页 > 其它

利用CImage类加载png图片

2014-02-20 11:57 120 查看
1、对于透明图片的处理可以用CImage类和GDI+,不过我更喜欢用CImage类,因为比较方便,加一个头文件#include "atlimage.h"就可以了,不像GDI+还有加载库,不过用CImage类的时候需要对图片进行处理一下,完整代码如下:

void MyPaint(HWND hwnd,HDC hdc)

{

HDC mdc;

mdc=CreateCompatibleDC(hdc);

SelectObject(mdc,fig.picBackground.hbmp);

BitBlt(hdc,0,0,WIDTH,HEIGHT,mdc,fig.picBackground.x,fig.picBackground.y,SRCCOPY);

//加载透明图片

CImage Image;

Image.Load("./img/HandOk.png");

if(Image.IsNull())

{

MessageBox(0,"加载HandOk.png失败",0,0);

return;

}

if (Image.GetBPP() == 32) //确认该图像包含Alpha通道

{

//对图片Alpha进行处理

for (int i = 0; i < Image.GetWidth(); i++)

{

for (int j = 0; j < Image.GetHeight(); j++)

{

byte *pByte = (byte *)Image.GetPixelAddress(i, j);

pByte[0] = pByte[0] * pByte[3] / 255;

pByte[1] = pByte[1] * pByte[3] / 255;

pByte[2] = pByte[2] * pByte[3] / 255;

}

}

}

Image.Draw(hdc,-5,290);

Image.Destroy();

ReleaseDC(hwnd,hdc);

}

运行效果图:



针对加载资源png则需要添加一段代码如下:

BOOL ImageFromIDResource(CImage *pImage, UINT nResID,LPCTSTR lpTyp)

{

if ( pImage == NULL)

return false;

pImage->Destroy();

HRSRC hRsrc = ::FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(nResID), lpTyp);

if (hRsrc == NULL)

return false;

HGLOBAL hImgData = ::LoadResource(AfxGetResourceHandle(), hRsrc);

if (hImgData == NULL)

{

::FreeResource(hImgData);

return false;

}

LPVOID lpVoid = ::LockResource(hImgData);
// 锁定内存中的指定资源

LPSTREAM pStream = NULL;

DWORD dwSize = ::SizeofResource(AfxGetResourceHandle(), hRsrc);

HGLOBAL hNew = ::GlobalAlloc(GHND, dwSize);

LPBYTE lpByte = (LPBYTE)::GlobalLock(hNew);

::memcpy(lpByte, lpVoid, dwSize);

::GlobalUnlock(hNew);
// 解除内存中的指定资源

HRESULT ht = ::CreateStreamOnHGlobal(hNew, TRUE, &pStream);
// 从指定内存创建流对象

if ( ht != S_OK )

{

GlobalFree(hNew);

}

else

{

pImage->Load(pStream);

GlobalFree(hNew);

}

::FreeResource(hImgData);

return true;

}

调用方式:CImage Image;

ImageFromIDResource(&Image,IDR_PNG1,"PNG");

2、GDI+的图片处理需要先加载一下库文件:

#include "d:\GDIPlus\includes\gdiplus.h" ////请修改为你的头文件路径

using namespace Gdiplus;

#pragma comment(lib, "d:\\GDIPlus\\lib\\gdiplus.lib")

显示图片代码如下(省略了部分代码,针对gdi+的使用只是在网上找了一部分代码做个笔记,以免以后用到)

Graphics graphics(hdc); // Create a GDI+ graphics object

Image image(_T("1.png")); // Construct an image

graphics.DrawImage(&image, 0, 0, image.GetWidth(), image.GetHeight());

针对加载资源png则需要添加一段代码如下:

BOOL ImageFromIDResource(UINT nID, LPCTSTR sTR,Image *&pImg)

{

HINSTANCE hInst = AfxGetResourceHandle();

HRSRC hRsrc = ::FindResource (hInst,MAKEINTRESOURCE(nID),sTR); // type

if (!hRsrc)

return FALSE;

// load resource into memory

DWORD len = SizeofResource(hInst, hRsrc);

BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);

if (!lpRsrc)

return FALSE;

// Allocate global memory on which to create stream

HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);

BYTE* pmem = (BYTE*)GlobalLock(m_hMem);

memcpy(pmem,lpRsrc,len);

GlobalUnlock(m_hMem);

IStream* pstm;

CreateStreamOnHGlobal(m_hMem,FALSE,&pstm);

// load from stream

pImg=Gdiplus::Image::FromStream(pstm);

// free/release stuff

pstm->Release();

FreeResource(lpRsrc);

GlobalFree(m_hMem);

return TRUE;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: