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

  • 相关阅读:
    linux下将可执行程序进行打包
    多节点OpenMPI集群的搭建和使用
    快排
    git 出现:warning: LF will be replaced by CRLF in
    String 根据 第一个逗号去掉逗好后面的内容
    SpringBoot项目中想去掉数据库查询到的数组双括号
    mybatis-plus多条件 or 的使用
    从linux上的docker持久化mysql数据恢复到本地mysql数据库
    @Repository和@Mapper
    JavaScript动画实例:爆裂的粒子
  • 原文地址:https://www.cnblogs.com/easeyeah/p/SvgToImage.html
Copyright © 2011-2022 走看看