Svg转Jpg
Svg转Jpg
需求描述
在C#中将 Svg 转换成 Jpg 图片。
转出来的图片,存在部分文字偏移走开的现象。
通过找到相应位置,调整偏移,解决问题。
关键在于,匹配到 hanging、baseline、rotate 的关键字,修改偏移位置实现。
实现的代码
public void svgToPng()
{
// 导出图件
int picWidth = 300, picHeight = 200, dpi = 50;
var svgFile = @".\output\svg.svg";
var svgLine = File.ReadAllLines(svgFile);
var svgContent = "";
var keyHanging = "<text dominant-baseline=\"hanging\"";
var keyRotate = "rotate(-90)";
var keyBaseline = "<text dominant-baseline=\"baseline\"";
for (var i = 0; i < svgLine.Count(); i++)
{
var line = svgLine[i];
if (line.IndexOf(keyHanging) >= 0 )
{
line = processText(line);
}
if (line.IndexOf(keyRotate) >= 0)
{
line = processText(line);
}
if (line.IndexOf(keyBaseline) >= 0)
{
line = processText(line);
}
svgContent += line;
}
var svg = SvgDocument.FromSvg<SvgDocument>(svgContent);
// 导出到 jpg
var jpgpath = @".\output\jpg2.jpg";
int nNewWidth = picWidth * 4;
int nNewHeight = picHeight * 4;
Bitmap bitmapJpg = svg.Draw(nNewWidth, nNewHeight);
bitmapJpg.Save(jpgpath, System.Drawing.Imaging.ImageFormat.Jpeg);
}
public string processText(string line)
{
var keyHanging = "<text dominant-baseline=\"hanging\"";
var keyRotate = "rotate(-90)";
var keyBaseline = "<text dominant-baseline=\"baseline\"";
var pattern = @"translate\(([^\)]+)\)";
var patternFontSize = @"font-size=""(\d+\.?\d*)""";
var match = Regex.Matches(line, pattern);
if (match.Count > 0)
{
var result = match[0].Value;
var m = match[0];
var groups = m.Groups;
var beforeText = groups[1].ToString();
string[] arrItem = beforeText.Split(new[] { ',' });
var x = Convert.ToDouble(arrItem[0]);
var y = Convert.ToDouble(arrItem[1]);
var matchFontSize = Regex.Matches(line, patternFontSize);
var fontSizeText = matchFontSize[0].Groups[1].Value;
var fontSize = Convert.ToDouble(fontSizeText);
if (line.IndexOf(keyRotate) >= 0)
{
if (x < 50)
{
x += 15;
}
else
{
x -= 12;
}
}
else if (line.IndexOf(keyHanging) >= 0)
{
if (fontSize > 10)
{
// 加上偏移
y += 12;
}
else
{
y += 6;
}
}
else if (line.IndexOf(keyBaseline) >= 0)
{
y -= 10;
}
var afterText = x + "," + y;
line = line.Replace(beforeText, afterText);
}
return line;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤