SVG中Path Data数据简化及文件夹所有文件批量导出为图片

119 篇文章 5 订阅
27 篇文章 0 订阅

先看效果图片:

using Svg;
using System;
using System.Collections.Generic;
using System.Drawing.Imaging;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows;

namespace SVG2Image
{
    /// <summary>
    /// 将SVG批量导出成PNG等图片
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        //保存图片路径
        string savePath = @"d:\output";
        //简化矢量图输入路径
        string savePathNew = @"d:\outputNew";
        //SVG文件路径
        string svgFilePath = @"d:\outputNew";
        //string svgFilePath = @"E:\界面\POD0606New\ICO";
        private void button_Click(object sender, RoutedEventArgs e)
        {
            string sizeText = textBox.Text;
            if (string.IsNullOrEmpty(sizeText)) sizeText = "64";
            string[] sizeArray = sizeText.Split(',');
            List<int> listSize = new List<int>();
            try
            {
                foreach (string s in sizeArray)
                {
                    listSize.Add(int.Parse(s));
                }
            }
            catch (Exception exc)
            {
                MessageBox.Show("输入的尺寸有误,必须为数字(多组用逗号隔开);\r\n" + exc.ToString());
                return;
            }

            if (!Directory.Exists(savePath))
            {
                Directory.CreateDirectory(savePath);
            }
            string[] arraySvgFiles = Directory.GetFiles(svgFilePath, "*.svg");
            int icoCount = arraySvgFiles.Length;
            int icoAllCount = 0;
            foreach (string file in arraySvgFiles)
            {
                string fileName = System.IO.Path.GetFileNameWithoutExtension(file);
                fileName = fileName.Replace("_New", "");

                try
                {
                    string svgFileContents = File.ReadAllText(file, Encoding.UTF8);
                    var byteArray = Encoding.ASCII.GetBytes(svgFileContents);
                    string saveFileName = savePath + @"\" + fileName + @"{0}_{1}.png";
                    foreach (int sz in listSize)
                    {
                        using (var stream = new MemoryStream(byteArray))
                        {
                            var svgDocument = SvgDocument.Open(stream);
                            svgDocument.Width = sz;
                            svgDocument.Height = sz;
                            var bitmap = svgDocument.Draw();
                            bitmap.Save(string.Format(saveFileName, sz, sz), ImageFormat.Png);
                        }
                        icoAllCount++;
                    }
                }
                catch (Exception exc)
                {
                    using (System.IO.StreamWriter sw = new System.IO.StreamWriter(savePath + @"\error.txt", true))
                    {
                        sw.WriteLine(fileName);// 直接追加文件末尾,换行
                    }
                }
            }
            MessageBox.Show(string.Format("有{0}张矢量标志图片,共生成{1}张图片!", icoCount, icoAllCount));
        }

        /// <summary>
        /// 根据菜单名称建立空SVG内容的文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCreateSVG_Click(object sender, RoutedEventArgs e)
        {
            string menuNames = @"成品类型维护|成品维护";
            string contentTemplate = @"<svg version=""1.1"" id=""图层_1"" xmlns=""http://www.w3.org/2000/svg"" xmlns:xlink=""http://www.w3.org/1999/xlink"" x=""0px"" y=""0px""
     width=""648.992px"" height=""648.992px"" viewBox=""0 0 648.992 648.992"" enable-background=""new 0 0 648.992 648.992""
     xml:space=""preserve"">

</svg>";
            string[] arrayMenus = menuNames.Split('|');
            foreach (string menu in arrayMenus)
            {
                using (System.IO.StreamWriter sw = new System.IO.StreamWriter(savePath + @"\" + menu + @".svg", true))
                {
                    sw.WriteLine(contentTemplate);// 直接追加文件末尾,换行
                }
            }
        }

        private void btnLostSvg_Click(object sender, RoutedEventArgs e)
        {
            string[] arraySvgFiles = Directory.GetFiles(svgFilePath, "*.svg");
            List<string> listSvgFiles = new List<string>();
            foreach (string file in arraySvgFiles)
            {
                listSvgFiles.Add(System.IO.Path.GetFileNameWithoutExtension(file));
            }
            string menuNames = @"系统管理|部门维护";
            string[] arrayMenus = menuNames.Split('|');
            foreach (string menu in arrayMenus)
            {
                if (!listSvgFiles.Contains(menu))
                {
                    using (System.IO.StreamWriter sw = new System.IO.StreamWriter(savePath + @"\WithoutFile.txt", true))
                    {
                        sw.WriteLine(menu);// 直接追加文件末尾,换行
                    }
                }
            }
        }

        private void btnReplace_Click(object sender, RoutedEventArgs e)
        {
            //string oldContent = txtBoxOldContent.Text;
            //txtBoxResultContent.Text = GetNumberByRound(oldContent);

            if (!Directory.Exists(savePathNew))
            {
                Directory.CreateDirectory(savePathNew);
            }
            string[] arraySvgFiles = Directory.GetFiles(svgFilePath, "*.svg");

            foreach (string file in arraySvgFiles)
            {
                string fileName = System.IO.Path.GetFileNameWithoutExtension(file);
                try
                {
                    string svgFileContents = File.ReadAllText(file, Encoding.UTF8);
                    svgFileContents = GetNumberByRound(svgFileContents);
                    string saveFileName = savePathNew + @"\" + fileName + @"_New" + System.IO.Path.GetExtension(file);
                    using (System.IO.StreamWriter sw = new System.IO.StreamWriter(saveFileName, false))
                    {
                        sw.WriteLine(svgFileContents);// 直接追加文件末尾,换行
                    }
                }
                catch (Exception exc)
                {
                    using (System.IO.StreamWriter sw = new System.IO.StreamWriter(savePathNew + @"\error.txt", true))
                    {
                        sw.WriteLine(fileName);// 直接追加文件末尾,换行
                    }
                }
            }
        }

        /// <summary>
        /// SVG代码简化
        /// </summary>
        /// <param name="str">SVG代码</param>
        /// <returns>简化后的代码</returns>
        private string GetNumberByRound(string str)
        {
            string pattern = @"([-,a-zA-Z\s]*)(\d+\.?\d*)";
            Regex r = new Regex(pattern);
            str = Regex.Replace(str, @"<!--.*-->", "");
            str = Regex.Replace(str, @"<!DOCTYPE.*>", "");
            /*
            <!-- Generator: Adobe Illustrator 14.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 43363)  -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
*/
            str = Regex.Replace(str, @"\r\n", "");
            string result = string.Empty;
            if (r.IsMatch(str))
            {
                MatchCollection mc = r.Matches(str);
                if (mc.Count == 0) return result;

                Dictionary<string, string> dicNum = new Dictionary<string, string>();

                foreach (Match m in mc)
                {
                    GroupCollection colls = Regex.Match(m.Value, pattern).Groups;
                    string v = string.Empty;
                    if (colls.Count > 1)
                    {
                        //foreach (Group item in colls)
                        {
                            //Console.WriteLine(item.Value.ToString());
                            string k = colls[0].Value;
                            v = colls[2].Value;
                            if (!string.IsNullOrEmpty(v) && !dicNum.ContainsKey(k))
                            {
                                dicNum.Add(k, colls[1].Value + Math.Round(Convert.ToDecimal(v), 1, MidpointRounding.AwayFromZero).ToString());
                            }
                        }
                    }
                    else
                    {
                        v = m.Value;
                        if (!string.IsNullOrEmpty(v) && !dicNum.ContainsKey(v))
                        {
                            dicNum.Add(v, Math.Round(Convert.ToDecimal(v), 1, MidpointRounding.AwayFromZero).ToString());
                        }
                    }

                }
                foreach (string key in dicNum.Keys)
                {
                    str = str.Replace(key, dicNum[key]);
                    //using (System.IO.StreamWriter sw = new System.IO.StreamWriter(savePath + @"\Keys.txt", true))
                    //{
                    //    sw.WriteLine(key +"\t" + dicNum[key]);// 直接追加文件末尾,换行
                    //}
                }

                result = str;
            }
            else { result = str; }

            return result.Replace("http://www.w3org/", "http://www.w3.org/");
        }
    }
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值