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

}

转载于:https://www.cnblogs.com/songtzu/archive/2013/01/06/2847177.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,你需要了解NAudio如何加载音频。以下是一个简单的示例代码: ```csharp using NAudio.Wave; // 加载音频文件 WaveFileReader reader = new WaveFileReader("audio.wav"); // 获取音频的采样率、声道数等信息 int sampleRate = reader.WaveFormat.SampleRate; int channels = reader.WaveFormat.Channels; // 读取音频数据 byte[] buffer = new byte[reader.Length]; reader.Read(buffer, 0, buffer.Length); // 关闭音频文件 reader.Close(); ``` 接下来,你可以使用GDI+绘图功能来显示音频波形。以下是一个简单的示例代码: ```csharp using System.Drawing; using System.Drawing.Drawing2D; // 创建Bitmap对象 Bitmap bmp = new Bitmap(800, 600); // 创建Graphics对象 Graphics g = Graphics.FromImage(bmp); // 设置绘图质量 g.SmoothingMode = SmoothingMode.HighQuality; g.InterpolationMode = InterpolationMode.HighQualityBicubic; // 绘制背景 g.Clear(Color.White); // 绘制波形 Pen pen = new Pen(Color.Black, 1); for (int i = 0; i < buffer.Length / 2; i++) { float x = i * 1.0f / (buffer.Length / 2) * bmp.Width; float y = (buffer[i * 2] + buffer[i * 2 + 1] * 256) / 65536.0f * bmp.Height; g.DrawLine(pen, x, bmp.Height / 2, x, bmp.Height / 2 - y); } // 保存Bitmap对象 bmp.Save("waveform.png"); // 释放资源 g.Dispose(); bmp.Dispose(); ``` 这段代码会将音频的波形绘制到一个800x600的Bitmap对象上,并保存为PNG格式的图片文件。你可以根据需要修改绘图的参数,比如画笔的颜色、粗细等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值