使用GDI+对图片进行操作

*************************************************************************************************
1、图片的显示
// 下面是GDI+要使用的几个头文件
#ifndef ULONG_PTR
#define ULONG_PTR unsigned long*
#endif
#include "Gdiplus.h"
#include <afxole.h>
#include <Atlbase.h>

Gdiplus::GdiplusStartupInput m_gdiplusStartupInput;
ULONG_PTR m_gdiplusToken;
// 初始化GDI+库
void InitGuiPlus()
{
 Gdiplus::GdiplusStartup(&m_gdiplusToken, &m_gdiplusStartupInput, NULL);
}

// 关闭GDI+库
void CleanupGuiPlus()
{
 Gdiplus::GdiplusShutdown(m_gdiplusToken);
}

Gdiplus::Bitmap * m_pBmp;
// 加载图片
Gdiplus::Bitmap * LoadPic(LPCSTR szPicUrl)
{
 Gdiplus::Bitmap * pBmp = NULL;
 CFileFind fFind;
 if (!fFind.FindFile(szPicUrl))
 {
  return pBmp;
 }
 USES_CONVERSION;
 // 打开刚才浏览的图片
 pBmp = new Gdiplus::Bitmap(A2W(szPicUrl));
 return pBmp;
}

// 卸载图片
void UnLoadPic()
{
 if (m_pBmp != NULL)
 {
  delete m_pBmp;
  m_pBmp = NULL;
 }
}

// 显示图片 (在WM_PAINT的响应处理函数对其调用)
void ShowPic(CDC *pDC, Gdiplus::Bitmap *pbmpSrc, int nSrcWidth, int nSrcHeight)
{
 ASSERT(pbmpSrc != NULL);
 Gdiplus::Graphics graphics(pDC->m_hDC);
 graphics.DrawImage(pbmpSrc, 0, 0, nSrcWidth, nSrcHeight);
}

*************************************************************************************************
2、利用GDI+对图片缩放后保存(头文件和初始化代码同1)
// 获取图片的编码信息
BOOL GetImageEncoderCLSID( CLSID& clsid, const wchar_t* format)
{
     UINT num=0, size=0;
     Gdiplus::GetImageEncodersSize(&num, &size);
     Gdiplus::ImageCodecInfo* pImageCodecInfo = (Gdiplus::ImageCodecInfo*)malloc(size);
     if(pImageCodecInfo == NULL)
 {
   return FALSE;
 }
     Gdiplus::GetImageEncoders(num, size, pImageCodecInfo );
     for( UINT i = 0; i<num; ++i )
     {
         if( wcscmp(pImageCodecInfo[i].MimeType, format) == 0 )
         {
              clsid = pImageCodecInfo[i].Clsid;
              free(pImageCodecInfo);
              return TRUE;
         }
     }
     free(pImageCodecInfo);
 pImageCodecInfo = NULL;
     return FALSE;
}

// 按尺寸保存图片
BOOL SavePicture(LPCSTR pszFileUrl, Gdiplus::Image *pSrcBmp, int nSavedWidth, int nSavedHeight)
{
 ASSERT(pSrcBmp != NULL);
 // 创建预保存的图片
 Gdiplus::Bitmap bmpSaved(nSavedWidth, nSavedHeight);
 Gdiplus::Graphics * pGraphics = Gdiplus::Graphics::FromImage(&bmpSaved);
 // 将pSrcBmp画到pGraphics中
 pGraphics->DrawImage(pSrcBmp, 0, 0, nSavedWidth, nSavedHeight);
 if (pGraphics == NULL)
 {
  return FALSE;
 }
 CLSID clImageClsid;
 // 获取图片的编码信息
 if (GetImageEncoderCLSID(clImageClsid, L"image/jpeg"))
 {
  USES_CONVERSION;
  // 保存入片
  bmpSaved.Save(A2W(pszFileUrl), &clImageClsid, NULL);
  delete pGraphics;
  pGraphics = NULL;
  return TRUE;
 }
 delete pGraphics;
 pGraphics = NULL;
 return FALSE;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值