利用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;
}
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;
}
相关文章推荐
- 如何加载显示jpg ,png bmp等图片,利用CImage
- vc++加载透明png图片方法——GDI+和CImage两种
- vc++加载透明png图片方法——GDI+和CImage两种
- vc++加载透明png图片方法——GDI+和CImage两种
- 使用CImage加载PNG图片文件
- vc++加载透明png图片方法——GDI+和CImage两种
- VC++加载透明png图片的两种常用方法——GDI+和CImage
- vc++加载透明png图片方法——GDI+和CImage两种 ,vs2005 vs2008 PNG背景
- vc++加载透明png图片方法——GDI+和CImage两种
- vc++加载透明png图片方法——GDI+和CImage两种
- vc++加载透明png图片方法-GDI+和CImage两种
- CImage 加载透明PNG图片
- vc++加载透明png图片方法——GDI+和CImage两种 ,vs2005 vs2008 PNG背景
- 加载png图片的两种方法 - GDI+和CImage
- MFC中CImage加载png图片出现黑色背景的解决办法!
- 如何利用CImage和AlphaBlend绘制PNG图片?
- vc++加载透明png图片方法——GDI+和CImage两种 ,vs2005 vs2008 PNG背景
- 使用GDI+和CImage类加载png图片
- 使用CImage加载PNG或其他图片文件(…
- 利用CImage显示透明PNG图片