您的位置:首页 > 其它

分享:Svg文件转换为图片(调用 Inkscape 命令行)

2013-06-20 11:44 393 查看
其实只是做了简单封装,可以方便进行批量转换.

获取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('.')[0];

HtmlAgilityPack.HtmlDocument document;
if (svgContent.Length > 0)
{
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 == 0)
this.InkscapeApplicationPath = "D:\\Program Files (x86)\\Inkscape\\inkscape.exe";

//调用本地系统进程
Process inkscape = Process.Start(new ProcessStartInfo(this.InkscapeApplicationPath, inkscapeArgs));
inkscape.WaitForExit(3000);
}
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://inkscape.org/

这是一个免费开源的矢量图处理软件.

维基百科:http://zh.wikipedia.org/wiki/Inkscape
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: