MFC内存中的图片怎么保存?

一,添加gdi相关文件

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

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

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考到debugrelease目录下

二,在程序中加载库

1,在C*APP头文件中添加两个变量

GdiplusStartupInput m_gdiplusStartupInput;

ULONG_PTR m_pGdiToken;

2,在C*APP文件InitInstance函数中加入初始化GDI+的函数:

GdiplusStartup(&m_pGdiToken, &m_gdiplusStartupInput, NULL);

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

ExitInstance()虚函数中添加

GdiplusShutdown(m_pGdiToken);

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

CDC* pdc = GetDC();

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

MemDC.CreateCompatibleDC(pdc);

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

MemBitmap.CreateCompatibleBitmap(pdc,nWidth,nHeight);

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

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

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

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

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

CString filename;//名字 eg: xxx.jpg / xxx.bmp 。。。。。

这里用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);

 

你可能感兴趣的:(个人文章)