无涯 原文 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 中编辑图形的效果:

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

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

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

    原文:(一)在 Blend 中绘制形状和路径 https://docs.microsoft.com/zh-cn/previous-versions/jj170881(v=vs.120) 在 Blend ...

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

    工作需要在MATLAB中绘制质点轨迹并保存成GIF以便展示. 绘制质点轨迹动图可用comet和comet3命令,使用例子如下: t = 0:.01:2*pi;x = cos(2*t).*(cos(t) ...

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

    CSharpGL(6)在OpenGL中绘制UI元素 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo,更适合入 ...

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

    HTML5在canvas中绘制复杂形状附效果截图 一.绘制复杂形状或路径 在简单的矩形不能满足需求的情况下,绘图环境提供了如下方法来绘制复杂的形状或路径. beginPath() : 开始绘制一个新路 ...

  5. 在Image控件中绘制文字

    //Canvas 在Image控件中绘制文字 procedure TForm1.Button1Click(Sender: TObject);begin  image1.Canvas.Font.Size ...

  6. Android中绘制圆角矩形图片及任意形状图片

    圆角矩形图片在苹果的产品中很流行,相比于普通的矩形,很多人都喜欢圆角矩形的图片,因为它避开了直角的生硬,带来更好的用户体验,下面是几个设计的例子: 下面在Android中实现将普通的矩形图片绘制成圆角 ...

  7. MATLAB坐标系中绘制图片

    MATLAB坐标系中绘制图片 方法一 使用图片坐标循环的方式,代码如下. clear,clc,close all tic; map=imbinarize(imread('map.bmp'));%map ...

  8. Java 在PPT中绘制图形

    Microsoft PowerPoint可支持在幻灯片中插入各种类型的图形并且可设置图形填充.线条颜色.图形大小.位置等.下面将通过Java编程来演示在PPT中绘制图形的方法. 工具:Free Spi ...

  9. Java 在PDF文档中绘制图形

    本篇文档将介绍通过Java编程在PDF文档中绘制图形的方法.包括绘制矩形.椭圆形.不规则多边形.线条.弧线.曲线.扇形等等.针对方法中提供的思路,也可以自行变换图形设计思路,如菱形.梯形或者组合图形等 ...

随机推荐

  1. wordpress学习二:源码目录结构和启动流程

    wordpress安装后的文件目录如下: 其中的主要目录和文件用途介绍如下: wp-admin:用于进行博客后台设置的功能目录 wp-content: wordpress的 主题,插件和本地化的存储目 ...

  2. Data Flow ->> Script Component

    和Control Flow中的Script Task非常类似,不同的是Script Component是Per-Row的执行类型.打个比方,在Script Component中加入两个Output的字 ...

  3. .NET在EF中使用sql,用动态类吧!

    .NET在EF中使用sql,用动态类吧! 前言 在.NET中使用Entity Framework能快速.方便地结合LINQ来对数据库进行一系列的增删改查操作.但是由于EF根据表达式最后生成通用的sql ...

  4. linux 命令案例学习——文件搜索

    两个搜索文件的工具 locate  ——仅仅通过文件名查找文件 find     ——依据文件的各种属性在既定目录(包括子目录)里查找 一个通常与文件搜索命令一起使用.处理搜索结果文件列表的命令 xa ...

  5. sleep和wait到底什么区别

    wait是在当前线程持有wait对象锁的情况下,暂时放弃锁,并让出CPU资源,并积极等待其它线程调用同一对象的notify或者notifyAll方法.注意,即使只有一个线程在等待,并且有其它线程调用了 ...

  6. zoj 3165 (最小割,最大点权独立集)

    胡伯涛的<最小割模型在信息学竞赛中的应用>写的真牛. 这道题是选择一些男孩和女孩参加party,邀请的男孩女孩之间不能有 8g,图就是个明显的二分图,就是选择一些点之间没有8g关系,就是二 ...

  7. ubuntu完美搭建git服务器【转】

    转自:http://blog.csdn.net/tommy_wxie/article/details/38779667 最近公司项目需要用到Git来管理项目,正好逢周末花了点时间在虚拟机的unbunt ...

  8. 自定义View(7)draw与onDraw区别

    draw()这个函数本身会做很多事情,可参看源码.         *      1. Draw the background         *      2. If necessary, save ...

  9. [POJ1631]Bridging signals (DP,二分优化)

    题目链接:http://poj.org/problem?id=1631 就是求一个LIS,但是范围太大(n≤40000),无法用常规O(n²)的朴素DP算法,这时需要优化. 新加一个数组s[]来维护长 ...

  10. cdoj 1342 郭大侠与甲铁城 树状数组+离线

    郭大侠与甲铁城 Time Limit: 1500/800MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit St ...