使用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

}

posted @ 2013-01-24 21:03  songtzu  阅读(958)  评论(0编辑  收藏  举报