vc6.0使用gdi+在内存中绘图并将其保存为bmp,jpg,gif,png等格式的图片
2011-11-28 11:00
951 查看
刚开始使用的是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);
一,添加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);
相关文章推荐
- vc6.0使用gdi+在内存中绘图并将其保存为bmp,jpg,gif,png等格式的图片
- VB6.0用GDI+保存图片为JPG、TIFF、PNG、GIF、BMP等格式
- VB6.0用GDI+保存图片为JPG、TIFF、PNG、GIF、BMP等格式
- VB60用 GDI+保存为JPG/TIFF/PNG/GIF/BMP等格式
- VB6.0用GDI+保存图像为BMP\JPG\PNG\GIF格式终结版。
- 数字图像处理 CImage类的使用与封装(jpg png gif tif bmp等格式图像的加载、数据读写、保存等功能)
- [WIN32]VB6.0用GDI+保存图像为BMP\JPG\PNG\GIF格式终结版。
- VB6.0用GDI+保存图像为BMP\JPG\PNG\GIF格式终结版。
- easyWeb2Pic -- 在IE浏览器中,将整个网页保存为BMP, JPEG/JPG, GIF, PNG或者TIFF图片
- C#使用GDAL将tif图像转换为jpg、bmp、png和gif格式的图像
- C# 图片格式(JPG,BMP,PNG,GIF)等转换为ICO图标
- 常见图片格式简单分析总结--JPG、PNG、GIF、BMP
- 各种图片格式(BMP,JPG, GIF,PNG, TGA) 简单介绍
- 保存一个免费的在线的图片转换工具网站,支持BMP,JPG,IOC,PNG和GIF
- GDI+实例教程之: 转换Image(BMP,JPG,GIF,PNG等) 到MetaFile(EMF等) 格式
- [转载]C#图片格式(JPG,BMP,PNG,GIF)等转换为ICO图标
- C++中使用CAtlHttpClient显示网络图片的方法,支持png,bmp,gif图片格式
- jpg、jpeg、png、gif、bmp、tiff、ai、cdr、eps 图片格式的区别
- 图片格式jpg,gif,png-8,png-24的区别,及其各自的使用场景
- C++中使用CAtlHttpClient显示网络图片的方法,支持png,bmp,gif图片格式