分享:Svg文件转换为图片(调用 Inkscape 命令行)
其实只是做了简单封装,可以方便进行批量转换.
获取Svg对象坐标的代码请看:根据svg节点对象类型和路径值转换坐标值,
DrawingColor方法是进行颜色填充的.
/// <summary>
/// svg文件转换为图片
/// </summary>
/// <param name="svgContent">svg内容</param>
/// <param name="svgFile">svg文件</param>
/// <param name="imgType">图片类型</param>
/// <returns>转换成功后的文件路径</returns>
public string SvgToImage(string outputDir, string svgContent = "", string svgFile = "", ImageType imgType = ImageType.Png)
{
var fileInfo = new FileInfo(svgFile);
string fileName = fileInfo.Name.Split('.')[]; HtmlAgilityPack.HtmlDocument document;
if (svgContent.Length > )
{
document = new HtmlAgilityPack.HtmlDocument();
document.LoadHtml(svgContent);
}
else
{
document = this.LoadDocumentFormFile(svgFile);
} //初始化Svg对象
SvgObject so = new SvgObject(document.DocumentNode.WriteTo());
//获取Svg坐标对象集合
Dictionary<string, ObjectPosition> dictPosition = so.GetSvgObjectPositions();
//进行颜色填充,返回新的Svg文档
document = DrawingColor(ref document, dictPosition);
//保存
document.Save(svgFile, Encoding.Default); string pngFileName = Path.Combine(outputDir, fileName + ".png");
//设置命令行参数,详情见该软件帮助文档.
//string inkscapeArgs = string.Format("-f {0} -e {1} -b {2}\"", svgFile, pngFileName, "#000000");
string inkscapeArgs = string.Format("inkscape {0} --export-png={1} --export-background={2}", svgFile, pngFileName, "#000"); //调用 Inkscape 进行svg转图片
try
{
//是否提供了自定义路径
if (this.InkscapeApplicationPath.Length == )
this.InkscapeApplicationPath = "D:\\Program Files (x86)\\Inkscape\\inkscape.exe"; //调用本地系统进程
Process inkscape = Process.Start(new ProcessStartInfo(this.InkscapeApplicationPath, inkscapeArgs));
inkscape.WaitForExit();
}
catch (Exception)
{
return "";
} if (!System.IO.File.Exists(pngFileName))
return ""; string imageFileName = Path.Combine(outputDir, fileName + ".$");
//最后再将png文件转换成其他格式图片文件.
Bitmap myImage = new Bitmap(pngFileName);
ImageFormat format = ImageFormat.Png;
switch (imgType)
{
case ImageType.Png:
return pngFileName;
case ImageType.Jpg:
imageFileName = imageFileName.Replace("$", "jpg");
format = ImageFormat.Jpeg;
break;
case ImageType.Bmp:
imageFileName = imageFileName.Replace("$", "bmp");
format = ImageFormat.Bmp;
break;
case ImageType.Gif:
break;
default:
break;
} myImage.Save(imageFileName, format);
return imageFileName;
}
最终图片如下:
保证两两相邻的人物填充颜色不重复.用的算法是简单的四边形是否重叠的算法.
Inkscape下载地址:
这是一个免费开源的矢量图处理软件.
维基百科:http://zh.wikipedia.org/wiki/Inkscape
分享:Svg文件转换为图片(调用 Inkscape 命令行)的更多相关文章
- php从数据库中取二进制流文件转换为图片,图片以二进制流存入数据库实现
php从数据库中取二进制流文件转换为图片,图片以二进制流存入数据库实现 function data_uri($contents, $mime) { $base64 = base64_encode($c ...
- 【使用Itext处理PDF文档(新建PDF文件、修改PDF文件、PDF中插入图片、将PDF文件转换为图片)】
iText简介 iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf的文档,而且可以将XML.Html文件转 ...
- Python通过调用windows命令行处理sam文件
Python通过调用windows命令行处理sam文件 以samtools软件为例 一.下载或者索取得到windows版本的samtools软件,解压后如下: 进入文件内部,有如下几个文件: 二.将s ...
- Windows 桌面和文件夹的右键->打开命令行窗口
Windows 桌面和文件夹的右键->打开命令行窗口 1.先按下shift,再点鼠标右键运行CMD,(不是管理员权限) 上图是我已经加了右键的,并且 系统设置了 ps代替cmd,所以是“在此处 ...
- scala调用Linux命令行
在 scala 里面存在 调用 Linux 命令行的函数: import scala.sys.process._ 执行的方法也不难: import scala.sys.process._ /** * ...
- IE浏览器中使用js调用cmd命令行demo
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...
- 在go中通过cmd调用python命令行参数量级过大问题解决
问题描述如下: 在go中使用cmd调用python命令行 cmd := exec.Command("python", "dimine/Kriging/matrix.py& ...
- 用 C# 实现文件信息统计(wc)命令行程序
软件的需求分析 程序处理用户需求的模式为: wc.exe [parameter][filename] 在[parameter]中,用户通过输入参数与程序交互,需实现的功能如下: 1.基本功能 支持 - ...
- java调用ffmpeg命令行推流遇到的问题
1.Java调用命令行,如果没有额外环境变量,不指定工作路径,Runtime有两个方法 public Process exec(String command) public Process exec( ...
随机推荐
- NOI2003 文本编辑器editor
1507: [NOI2003]Editor Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 1908 Solved: 738[Submit][Statu ...
- ruby脚本打印日志到rspec的报告文件中
在通过ruby+webdriver+rspec做自动化测试的时候,为了便于观察用例执行情况,我基本上都会用 rspec XX.rb --format doc -o result.log 如果遇到失败的 ...
- 很反感Java Web 三层框架
为什么反感,大家 看图就知道了.一层一层的框架叠加,要达到精通就要一个一个框架的去深入了解,谁有这个精力?PHP没有这么多框架,为何依然能开发大型网站呢? 不过此图的原文却在推销使用Java,原文点此 ...
- bzoj 1876 [SDOI2009]SuperGCD(高精度+更相减损)
1876: [SDOI2009]SuperGCD Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2384 Solved: 806[Submit][Sta ...
- Hadoop之Pig安装
Pig可以看做是Hadoop的客户端软件,使用Pig Latin语言可以实现排序.过滤.求和.分组等操作. Pig的安装步骤: 一.去Pig的官方网站下载.http://pig.apache.org/ ...
- 为什么JavaScript开发如此疯狂
本文由码农网 – 小峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! Web开发太有意思了! 但是JavaScript则……令人望而生畏. Web开发中其他一切对你而言都是小菜一碟, ...
- oc学习之路-----搞死指针之内存存储int类型
关于每个数据类型个字节在内存中的存储地址(以int为例) 先上图 如题,为什么说好的*p = &c是1啊,为什么是513呢,一开始,我也觉得挺惊讶的,后面听老师分析了一下才知道怎么回事,但是还 ...
- Yii2 ActiveForm表单自定义样式
实例: <?php $form = ActiveForm::begin([ 'fieldConfig' => [ 'template' => '<div class=" ...
- C++的静态分发(CRTP)和动态分发(虚函数多态)的比较
虚函数是C++实现多态的工具,在运行时根据虚表决定调用合适的函数.这被称作动态分发.虚函数很好的实现了多态的要求,但是在运行时引入了一些开销,包括: 对每一个虚函数的调用都需要额外的指针寻址 虚函数通 ...
- [Node] 逃离回调地狱
逃离Node回调地狱 Background : 在Node中,函数的返回结果大多利用回调的方式处理.如简单的判断文件是否存在并读取内容: var fs = require('fs'); fs.exis ...