当前位置:网站首页>SVG中Path Data数据简化及文件夹所有文件批量导出为图片
SVG中Path Data数据简化及文件夹所有文件批量导出为图片
2022-04-23 06:27:00 【大可山人】
先看效果图片:
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/");
}
}
}

版权声明
本文为[大可山人]所创,转载请带上原文链接,感谢
https://blog.csdn.net/johnsuna/article/details/83375228
边栏推荐
猜你喜欢

Reflection on the systematic design of Android audio and video caching mechanism

Django使用mysql数据库报错解决

设置了body的最大宽度,但是为什么body的背景颜色还铺满整个页面?

Reflect on the limitations of event bus and the design and implementation of communication mechanism in component development process

如何判断点是否在多边形内(包含复杂多边形或者多边形数量很多的情况)

redis连接出错 ERR AUTH <password> called without any password configured for the default user.

FSM有限状态机

SAP pi / PO rfc2restful publishing RFC interface is a restful example (proxy indirect method)

Ogldev reading notes

Design optimization of MySQL database
随机推荐
How to judge whether a point is within a polygon (including complex polygons or a large number of polygons)
SAP DEBUG调试FOR IN、REDUCE等复杂的语句
2022.3.14 Ali written examination
Date object (JS built-in object)
9. Common functions
keytool: command not found
Thorough inquiry -- understanding and analysis of cocos2d source code
12.约束
Moment. Format of format method function in JS
异步的学习
RGB颜色转HEX进制与单位换算
Common DOS commands
SVG中年月日相关的表达式
驼峰命名对像
SAP PI / Po rfc2restful Publishing RFC interface as restful examples (proxy indirect)
FSM有限状态机
【TED系列】如何与内心深处的批评家相处?
C# 文本文件的查找及替换(WinForm)
BTREE, B + tree and hash index
‘npm‘不是内部或外部命令,也不是可运行的程序 或批处理文件