[转] C#中绘制矢量图形

无涯 原文 C# 绘制矢量图形 [原创]

近来参与了一个项目,软件主要的功能就是使用C#画矢量图,然后导出到Word、Excel、Powerpoint中,并且能够再次被编辑。以下是我们的解决过程:

首先应该确定在Office文档中可编辑图形使用的格式;学习了相关资料,了解到Office文档主要支持三种矢量图的格式:1、VML图形,2、WMF
文件格式
,3、EMF文件格式。由于VML图开一般使用HTML语言进行描述,不便于进行操作,因此决定采用WMF和EMF文件格式。

接下来的工作就是要让C#根据提供的数据生成WMF或EMF格式的矢量图形;学习了C#提供的GDI+绘图类库,GDI+可以绘制矢量图形,代码示例如下:

  /// <summary>
  /// 导出为 Emf 或 Wmf 文件
  /// </summary>
  /// <param name="filePath">文件路径</param>
  /// <returns>是否成功</returns>
  private bool Export(string filePath)
  {
   try
   {
    Bitmap bmp = new Bitmap(220,220);
    Graphics gs = Graphics.FromImage(bmp);
    Metafile mf  = new Metafile(filePath,gs.GetHdc());

    Graphics g = Graphics.FromImage(mf);

    Draw(g);

    g.Save();
    g.Dispose();
    mf.Dispose();

    return true;
   }
   catch
   {
    return false;
   }
  }
  /// <summary>
  /// 绘制图形
  /// </summary>
  /// <param name="g">用于绘图的Graphics对象</param>
  private void Draw(Graphics g)
  {
   HatchBrush hb = new HatchBrush(HatchStyle.LightUpwardDiagonal, Color.Black, Color.White);

   g.FillEllipse(Brushes.Gray,10f,10f,200,200);
   g.DrawEllipse(new Pen(Color.Black,1f),10f,10f,200,200);

   g.FillEllipse(hb,30f,95f,30,30);
   g.DrawEllipse(new Pen(Color.Black,1f),30f,95f,30,30);

   g.FillEllipse(hb,160f,95f,30,30);
   g.DrawEllipse(new Pen(Color.Black,1f),160f,95f,30,30);

   g.FillEllipse(hb,95f,30f,30,30);
   g.DrawEllipse(new Pen(Color.Black,1f),95f,30f,30,30);

   g.FillEllipse(hb,95f,160f,30,30);
   g.DrawEllipse(new Pen(Color.Black,1f),95f,160f,30,30);

   g.FillEllipse(Brushes.Blue,60f,60f,100,100);
   g.DrawEllipse(new Pen(Color.Black,1f),60f,60f,100,100);

   g.FillEllipse(Brushes.BlanchedAlmond,95f,95f,30,30);
   g.DrawEllipse(new Pen(Color.Black,1f),95f,95f,30,30);

   g.DrawRectangle(new Pen(System.Drawing.Brushes.Blue,0.1f),6,6,208,208);

   g.DrawLine(new Pen(Color.Black,0.1f),110f,110f,220f,25f);
   g.DrawString("剖面图",new Font("宋体",9f),Brushes.Green,220f,20f);
}

产生的图形如下:

放大后效果:

在Word 中编辑图形的效果:

至此,实现了该软件的技术要求功能。

时间: 2024-08-03 07:06:56

[转] C#中绘制矢量图形的相关文章

(一)在 Blend 中绘制形状和路径

原文:(一)在 Blend 中绘制形状和路径 https://docs.microsoft.com/zh-cn/previous-versions/jj170881(v=vs.120) 在 Blend 中绘制形状和路径 2015/07/21 在 Blend 中,形状正是你所期望的内容. 例如:矩形.圆或椭圆. 路径是更加灵活的形状版本. 你可以执行某些操作,如重新调整它们的形状,或将它们合并在一起以形成新形状. 形状和路径使用矢量图形,因此它们可很好地按高分辨率显示进行缩放. 如果想要了解有关矢

MATLAB中绘制质点轨迹动图并保存成GIF

工作需要在MATLAB中绘制质点轨迹并保存成GIF以便展示. 绘制质点轨迹动图可用comet和comet3命令,使用例子如下: t = 0:.01:2*pi;x = cos(2*t).*(cos(t).^2);y = sin(2*t).*(sin(t).^2);z = t;comet(x,y,0.1); %绘制二维%comet3(x,y,z,0.1); %绘制三维 这有一个问题在于comet或comet3无法控制绘制的动画的速度,为了实现这一点,一个可行的方法是重写comet和comet3,在每

HTML5在canvas中绘制复杂形状附效果截图

HTML5在canvas中绘制复杂形状附效果截图 一.绘制复杂形状或路径 在简单的矩形不能满足需求的情况下,绘图环境提供了如下方法来绘制复杂的形状或路径. beginPath() : 开始绘制一个新路径. closePath() : 通过绘制一条当前点到路径起点的线段来闭合形状. fill() , stroke() : 填充形状或绘制空心形状. moveTo() : 将当前点移动到点(x,y). lineTo() : 从当前点绘制一条直线到点(x,y). arc(x,y,r,sAngle,eAn

HTML5 在canvas中绘制矩形

作者:卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/32930501 一.绘制矩形 canvas使用原点(0,0)在左上角的坐标系统,x坐标向右递增,y坐标向下递增. 使用绘图环境的矩形绘制函数来绘制矩形. fillRect(x,y,width,height) : 绘制一个实心的矩形. strokeRect(x,y,width,height) : 绘制一个空心的矩形. clearRect(x,y,width,height) : 清

如何在html5的canvas画布中绘制gif动态图片

我们都知道如何在html5的canvas画布上绘制静态图片(jpeg, png等),直接用canvas中的drawImage方法即可,那么如何绘制动态图片(gif)? 相信大家都知道动态图片之所以动态,是因为它是由很多图片按一定的帧数顺序播放而成的,因此我们是否也可以模拟这样的帧数,每隔一定的时间重新 绘制图片,就能画出动态图片呢?答案当然是YES.下面就是我自己测试的一个例子,代码如下: 1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 &l

Direct3D中绘制图元的两种方式

DirectX 中绘制图元有两种类型的函数,一个是DrawPrimitiveUp,一个是DrawPrimitive,当然跟索引相关的也有两个类似的函 数,一个DrawIndexedPrimitiveUp,一个是DrawIndexedPrimitive: HRESULT DrawPrimitiveUP( [in]  D3DPRIMITIVETYPE PrimitiveType, [in]  UINT PrimitiveCount, [in]  const void *pVertexStreamZe

HTML5 在canvas中绘制复杂形状

作者:卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/32942667 一.绘制复杂形状或路径 在简单的矩形不能满足需求的情况下,绘图环境提供了如下方法来绘制复杂的形状或路径. beginPath()  : 开始绘制一个新路径. closePath()  : 通过绘制一条当前点到路径起点的线段来闭合形状. fill() , stroke()  : 填充形状或绘制空心形状. moveTo()  : 将当前点移动到点(x,y). lin

Matlab-Octave中绘制网格图和等高线:mesh 和 surf

x=linspace(-50, 50, 50); % 在x轴上取50点y=linspace(-25, 25, 25); % 在y轴上取25点[xx,yy]=meshgrid(x, y); % xx和yy都是矩阵zz=8000-2.*xx.*xx-5.*yy.*yy; % 计算函数值,zz也是21x21的矩阵surf(xx, yy, zz); % 画出立体曲面图colorbar; %如下图,右边那个色卡 可按回车 contour(xx,yy,zz)colorbar 可按回车surfc(xx,yy,

CSharpGL(6)在OpenGL中绘制UI元素

CSharpGL(6)在OpenGL中绘制UI元素 主要内容 学习使用IUILayout接口及其机制,以实现在OpenGL中绘制UI元素. 以SimpleUIAxis为例演示如何使用IUILayout. 下载 您可以在(https://github.com/bitzhuwei/CSharpGL)找到最新的源码.欢迎感兴趣的同学fork之. 什么是OpenGL中的UI元素 您可以在源码中找到SimpleUIAxis这一示例. 如上图所示,有5个坐标轴,中间那个是一个普通的三维模型(元素),作为对照