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

  • 相关阅读:
    将PHP文件生成静态文件源码
    Entity Framework Code First 学习日记(6)一对多关系
    Entity Framework Code First 学习日记(5)
    Entity Framework Code First 学习日记(3)
    Entity Framework Code First 学习日记(7)多对多关系
    Entity Framework Code First学习日记(2)
    Entity Framework Code First 学习日记(8)一对一关系
    Entity Framework Code First 学习日记(9)映射继承关系
    Entity Framework Code First 学习日记(10)兼容遗留数据库
    Entity Framework Code First 学习日记(4)
  • 原文地址:https://www.cnblogs.com/easeyeah/p/SvgToImage.html
Copyright © 2011-2022 走看看