• 分享: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('.')[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

  • 相关阅读:
    socket 第一课
    _getitem__ __setitem__ __delitem__ __len__
    单继承&多继承 注意点
    面对对象 类&对象
    异常检测
    模块导入
    序列化模块注意点 json&pickle
    re模块
    filter和map
    Maven入门
  • 原文地址:https://www.cnblogs.com/easeyeah/p/SvgToImage.html
Copyright © 2020-2023  润新知