GDI+使用小记

1.初始化:

#include <GdiPlus.h>
using namespace Gdiplus; 
#pragma comment(lib,"gdiplus.lib")
 GdiplusStartupInput gdiplusStartupInput;
    GdiplusStartup(&Gdi_token, &gdiplusStartupInput, NULL) ;
  GdiplusShutdown(Gdi_token);

2.使用:
先贴几个简单的例子:

绝对路径:

            Image image(TEXT("D:\\Program Files\\vs2005_Project\\test\\test\\res\\未标题-1.png"));
            CPaintDC dc(this);
            Graphics g(dc) ;
            g.DrawImage(&image,0,0,image.GetWidth(),image.GetHeight());

不要写Image img;这样会报错:error C2248: “Gdiplus::Image::Image”: 无法访问 protected 成员(在“Gdiplus::Image”类中声明)

相对路径:

BOOL LoadResImage(int nResID,Image * &lpImage,LPCTSTR lpType = TEXT("PNG"));
BOOL LoadResImage(int nResID,Image * &lpImage, LPCTSTR lpType)
{
    HINSTANCE hIns=AfxGetInstanceHandle();
    HRSRC hRsrc = ::FindResource (hIns,MAKEINTRESOURCE(nResID),lpType); // type 
    if (!hRsrc) 
        return FALSE; 
    // load resource into memory 
    DWORD len = SizeofResource(hIns, hRsrc); 
    BYTE* lpRsrc = (BYTE*)LoadResource(hIns, hRsrc); 
    if (!lpRsrc) 
        return FALSE; 
    // Allocate global memory on which to create stream 
    HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len); 
    //HGLOBAL m_hMem = GlobalAlloc(GHND, len); 
//=======================================================
//GMEM_FIXED:分配固定的内存
//GMEM_MOVEABLE:分配可移动的内存,不能与 GMEM_FIXED 组合使用
//GMEM_ZEROINIT:将所申请内存初始化为0.
//=======================================================
    BYTE* pmem = (BYTE*)GlobalLock(m_hMem); 
    memcpy(pmem,lpRsrc,len); 
    IStream* pstm; 
    HRESULT ht =  CreateStreamOnHGlobal(m_hMem,FALSE,&pstm); 
    if (ht != S_OK)
    {
        GlobalFree(m_hMem);
        return FALSE ;
    }
    // load from stream 
    lpImage=Gdiplus::Image::FromStream(pstm); 
    // free/release stuff 
    GlobalUnlock(m_hMem); 
    pstm->Release(); 
    FreeResource(lpRsrc);
         GlobalFree(m_hMem);return TRUE ;
}

调用:

Image *pimage;
            //BOOL result  = LoadResImage(IDR_JPG1,pimage,TEXT("JPG")) ;
            BOOL result  = LoadResImage(IDB_PNG1,pimage,TEXT("PNG")) ;
            if (result)
            {
                CPaintDC dc(this);
                Graphics g(dc) ;
                g.DrawImage(pimage,0,0,pimage->GetWidth(),pimage->GetHeight());
            }

小知识:要用PS创建背景透明的PNG,直接把背景删了,保存。同样,上面例子画出来的PNG透明部分会把底色透出来


 

 

3.判断Image对象的类型:
简单说明例子:

                            GUID formatID;
                pimage->GetRawFormat(&formatID);
                int m_nImgFormat;
                enum IMGFORMAT { if_bmp, if_jpg, if_png, if_gif, if_tiff, if_error };
                if (formatID == Gdiplus::ImageFormatBMP)
                {
                    m_nImgFormat = if_bmp;
                }
                if (formatID == Gdiplus::ImageFormatJPEG)
                {
                    m_nImgFormat = if_jpg;
                }
                if (formatID == Gdiplus::ImageFormatPNG)
                {
                    m_nImgFormat = if_png;
                }
                if (formatID == Gdiplus::ImageFormatGIF)
                {
                    m_nImgFormat = if_gif;
                }
                if (formatID == Gdiplus::ImageFormatTIFF)
                {
                    m_nImgFormat = if_tiff;
                }

 

posted on 2016-01-08 20:26  &大飞  阅读(559)  评论(0编辑  收藏  举报

导航