vc6.0使用gdi+在内存中绘图并将其保存为bmp,jpg,gif,png等格式的图片

刚开始使用的是gdi保存cview中的绘图内容,但是发现由于保存的是位图所以保存下来的图片的大小很大,每个大概有2M左右,所以在网上找解决方法,选择使用GDI+来保存绘图为图片,大小为20K左右,主要过程如下

一,添加gdi相关文件

      1,从网络上下载gdi头文件和库文件  http://www.codeguru.com/code/legacy/gdi/GDIPlus.zip

2,解压之后将将其中的Includes和Lib中的文件拷到vc目录下的Includes和Lib文件夹中;

3,将以下代码加入StdAfx.h头文件中:

#ifndef   ULONG_PTR

#define   ULONG_PTR   unsigned   long*

#include   "GdiPlus.h "

using   namespace   Gdiplus;

#pragma   comment(lib,   "gdiplus.lib ")

#endif

4,将gdiplus.dll考到debug和release目录下

二,在程序中加载库

   1,在C*APP头文件中添加两个变量
    GdiplusStartupInput m_gdiplusStartupInput;
    ULONG_PTR m_pGdiToken;

  2,在C*APP文件  的InitInstance函数中加入初始化GDI+的函数: 
GdiplusStartup(&m_gdiplusToken,   &m_gdiplusStartupInput,   NULL); 

  3,在C*APP文件 中添加ExitInstance()虚函数

在ExitInstance()虚函数中添加

GdiplusShutdown(m_gdiplusToken);

三使用GDI+          GDI+的使用很方便代码如下

              CDC   MemDC;   //首先定义一个显示设备对象

                  CBitmap   MemBitmap;//定义一个位图对象

                  MemBitmap.CreateCompatibleBitmap(pdc,nWidth,nHeight);

                  //随后建立与屏幕显示兼容的内存显示设备

                  MemDC.CreateCompatibleDC(pdc);

                  //这时还不能绘图,因为没有地方画   ^_^

                  //下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小

                  //将位图选入到内存显示设备中

                  //只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上

                  CBitmap   *pOldBit=MemDC.SelectObject(&MemBitmap);

             //先用背景色将位图清除干净,这里我用的是白色作为背景

                  //你也可以用自己应该用的颜色

                  MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));

        

                          CString filename;//名字

                  这里用MemDC绘图//

              MemDC.move(0,0);

              MemDC.lineto(100,100);

                    USES_CONVERSION;      //将cstring转化为const wchar*

            WCHAR* pBuf = T2W((LPCTSTR)filename);

                 

 

               //这里就是将内存中的绘图转化成图片了

                          Bitmap bm((HBITMAP)MemBitmap, NULL);//定义bitmap

                          CLSID pngClsid; 

                          GetEncoderClsid(L"image/jpeg", &pngClsid); 

               bm.Save(pBuf, &pngClsid, NULL);

                          MemDC.DeleteDC();

其中GetEncoderClsid(const WCHAR* format, CLSID* pClsid)代码如下

int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
 UINT num= 0;
 UINT size= 0;

 ImageCodecInfo* pImageCodecInfo= NULL;

 GetImageEncodersSize(&num, &size);
 if(size== 0)
 {
  return -1;
 }
 pImageCodecInfo= (ImageCodecInfo*)(malloc(size));
 if(pImageCodecInfo== NULL)
 {
  return -1;
 }

 GetImageEncoders(num, size, pImageCodecInfo);

 for(UINT j=0; j< num; ++j)
 {
  if(wcscmp(pImageCodecInfo[j].MimeType, format)== 0)
  {
   *pClsid= pImageCodecInfo[j].Clsid;
   free(pImageCodecInfo);
   return j;
  }
 }

 free(pImageCodecInfo);
 return -1;
}

该函数使用方法很方便,如下面的代码就分别获得5中图像编码器的CLSID

CLSID encoderClsid

    GetEncoderClsid(L"image/png", &encoderClsid);    //png

    GetEncoderClsid(L"image/bmp", &encoderClsid);

    GetEncoderClsid(L"image/gif", &encoderClsid);

    GetEncoderClsid(L"image/jpeg", &encoderClsid);

    GetEncoderClsid(L"image/tiff", &encoderClsid);

 【原文】http://blog.csdn.net/zhha86/article/details/7018732


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值