zoukankan      html  css  js  c++  java
  • 使用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

    }

  • 相关阅读:
    oracle 11g行转列 列转行
    System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本
    ORA-00257: 归档程序错误。在释放之前仅限于内部连接
    java 回传参数
    Oracle 删除表分区
    Oracle 删除重复数据只留一条
    cmd下windows批处理,获取当前系统时间,生成日志文件名
    c# 应用程序部署发布
    eclipse 集成 STS 插件
    Mamen所需要的jar包怎么生成
  • 原文地址:https://www.cnblogs.com/songtzu/p/2875637.html
Copyright © 2011-2022 走看看