使用GDI+保存用户的绘图数据.
使用GDI+保存用户的绘图数据.
将用户的绘图保存为一副bmp图片.
//定义bmp图片对象
Bitmap bmp(300, 300);//给出要创建的图片的尺寸即可------------------------1
//定义绘图对象
Graphics g(&bmp);//所有的绘图都由g来完成--------------------------------------2
//通过g来绘制图像
g.Draw(...);//-------------------------------------------------------------------------------3
//.....
//绘图完毕
//保存刚刚绘制的图像数据
CLSID Clsid;//-------------------------------------------------------------------------------4
GetEncoderClsid(L"image/bmp", &Clsid);//----------------------------------------5
bmp.Save(L"ljztest.bmp", &Clsid);//-------------------------------------------------6
//保存完毕, GDI+就是这么easy!
程序说明:
第2行:
创建绘图对象时将bmp对象作为参数, 这样g所有的绘图动作将能直接作用在这副图片上.
其实g所有的绘图都已经由bmp对象保存在内存中了. 稍后只要调用bmp的保存方法即可将该图片保存下来即可.
第3行:
用户的绘图操作. 这时这个操作的效果是不会显示在界面上的, 类似于重定向, 这时的绘图数据都已经"流"入了bmp对象.
第4-5行:
获得编码器
在保存bmp对象为一个图片时, 系统要求提供一个编码器, 这样系统才知道怎样来对图像数据进行编码.(如果是jpeg编码器, 那么最后将可以保存为jpg文件)
所以要想保存为其他格式的(如gif)图片, 只需要获取对应的编码器即可.(方便的要命吧)
注意:
GetEncoderClsid函数需要自己实现.
文章最后给出了该函数的一个实现, 您只要直接copy到你的程序中即可.
第6行:
保存bmp对象为图片文件.
GDI+的使用注意事项:
对于VS.NET2003中使用GDI+时需要如下"预处理":
1. 头文件
#include "gdiplus.h"
#include "Gdiplusheaders.h"
如果有预编译头文件, 那么最好将他们放入预编译头文件中.
2. 命名空间
GDI+的名称空间为:Gdiplus
使用GDI+前最好:using namespace Gdiplus;
3. 库文件
VS.NET2003默认情况下是不会链接gdi+的库的.
需要设置:
Project->Property Pages->Config Properties->Linker->CommandLine->AdditionalOptions
在里面加入:gdiplus.lib 即可
4. GDI+的初始化
上面的所有步骤都完成后, 我们还不能正式开始使用GDI+
在此之前必须先"启动"GDI+
在任何调用GDI+的代码执行前必须先调用如下代码, 启动GDI+:
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
经过上面的4步后, GDI+就可以正常使用了.
在完成这个任务是GDI+比GDI方便得多了.(实质上用GDI来做非常麻烦!)
GetEncoderClsid的实现如下:
//该函数定义为全局即可, 函数没有任何依赖性.
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
UINT num = 0; // number of image encoders
UINT size = 0; // size of the image encoder array in bytes
ImageCodecInfo* pImageCodecInfo = NULL;
GetImageEncodersSize(&num, &size);
if(size == 0)
return -1; // Failure
pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return -1; // Failure
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; // Success
}
}
free(pImageCodecInfo);
return -1; // Failure
}