zoukankan      html  css  js  c++  java
  • 分享: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

  • 相关阅读:
    Ubuntu实现树莓派交叉编译
    IOS页面自动布局 之 NSLayoutConstraint基础篇
    环信SDK与Apple Watch的结合(3)
    数据结构C语言版干货------->线性表之顺序表
    Java的反射机制(应用篇)
    Java之泛型深解
    Java集合类--->入门下篇
    Java之泛型浅解
    Java集合类--->入门上篇
    数据结构基础铺垫篇000
  • 原文地址:https://www.cnblogs.com/easeyeah/p/SvgToImage.html
Copyright © 2011-2022 走看看