Дмитрий Полянин Asked:2020-04-07 22:13:12 +0000 UTC2020-04-07 22:13:12 +0000 UTC 2020-04-07 22:13:12 +0000 UTC 如何在 C# 中将 SVG 转换为 JPG 或 PNG? 772 我在 C# 中生成 SVG 文件,我需要使用 C# 将它们呈现为 JPG 或 PNG。我怎样才能做到这一点? 任何选项都很有趣,但我只接受适用于共享主机的答案,因为脚本将在那里运行。ASP.NET MVC 5 托管 - Smarterasp。 c# 3 个回答 Voted Best Answer Дмитрий Полянин 2020-04-08T00:30:02Z2020-04-08T00:30:02Z C# 的SVG库。 像这样工作: SvgDocument svgDoc = SvgDocument.Open("myFile.svg"); System.Drawing.Bitmap bitmap = svgDoc.Draw(); bitmap.Save("outFile.jpg", ImageFormat.Jpeg); 不需要从NuGet拿包,因为版本比较老,bug很多,直接hot,要从github下载编译。 该项目正在运行、支持和开发,但事实证明,开发人员正在逐步消除一些错误。 该库不仅允许渲染现成的 SVG 文件,还允许使用其 API 动态创建它。 Дмитрий Полянин 2020-04-08T15:41:11Z2020-04-08T15:41:11Z 1. 使用Inkscape的方法。 从命令行运行以下命令 inkscape.exe -z "pathToSVGFile.svg" --export-png="pathToResultFile.png" 在这种情况下,inskape我在系统路径中注册了它们。 事实证明,Inkscape并非所有在浏览器中工作的文件都可以转换。href为了正确操作,必须将y属性use替换为 withxlink:href并将其写入 head 标签svg xmlns:xlink="http://www.w3.org/1999/xlink"中。 2.使用node.js模块svgexport的方法 全局安装svgexport模块 npm install svgexport -g 从控制台运行命令 svgexport "FileNameWithPath.svg" "ResultFileNameWithPath.png" png 100% 这种方法的优势在于它使用基于模块node.js svgexport的浏览器引擎进行渲染,这意味着结果将与基础浏览器中的显示最接近。此外,可以最大限度地使用浏览器语法。phantom.jsWebKitChromium 这种方法的缺点是在处理带有俄文名称的路径时,转换命令会出错,因此所有文件都必须放在英文目录中。 您可以在此处和此处阅读更多详细信息。 添加: 在 github 上阅读问题后,我意识到路径不起作用,很可能是由于路径中存在空格。 MSDN.WhiteKnight 2020-04-10T12:04:42Z2020-04-10T12:04:42Z 如果您有 Internet Explorer 11,则可以使用 MSHTML COM 对象: using System; using System.Collections.Generic; using System.Drawing; using System.Text; using System.Runtime.InteropServices; using System.ComponentModel; //Reference: System.Drawing //Reference: Microsoft HTML Object Library namespace SVG { public class SvgConvert { public static void ToPng(string svgcontent, string outpath) { RECTL rcClient = new RECTL(); bool b = SystemParametersInfo(SPI_GETWORKAREA, 0, ref rcClient, 0); if (b == false) { rcClient.bottom = 480; rcClient.right = 640; } int width = (int)(rcClient.right - rcClient.left); int height = (int)(rcClient.bottom - rcClient.top); IntPtr screendc = GetDC(IntPtr.Zero); string svghtml = "<html><head><meta http-equiv=\"X-UA-Compatible\" content=\"IE=11\" /></head><body>" + svgcontent + "</body></html>"; mshtml.HTMLDocument doc = null; mshtml.IHTMLDocument2 d2 = null; IOleObject pObj = null; IViewObject pView = null; try { doc = new mshtml.HTMLDocument(); //создание документа d2 = (mshtml.IHTMLDocument2)doc; int hr; //установка размера документа pObj = (IOleObject)d2; SIZEL sz = new SIZEL(); sz.x = (uint)MulDiv(width, HIMETRIC_INCH, GetDeviceCaps(screendc, LOGPIXELSX)); sz.y = (uint)MulDiv(height, HIMETRIC_INCH, GetDeviceCaps(screendc, LOGPIXELSY)); ; hr = pObj.SetExtent((int)System.Runtime.InteropServices.ComTypes.DVASPECT.DVASPECT_CONTENT, ref sz); if (hr != 0) throw Marshal.GetExceptionForHR(hr); //запись SVG в документ d2.write(svghtml); d2.close(); //преобразование в Bitmap pView = (IViewObject)d2; Bitmap bmp = new Bitmap(width, height); Graphics g = Graphics.FromImage(bmp); using (g) { IntPtr hdc = g.GetHdc(); hr = pView.Draw((int)System.Runtime.InteropServices.ComTypes.DVASPECT.DVASPECT_CONTENT, -1, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, hdc, ref rcClient, IntPtr.Zero, IntPtr.Zero, 0); if (hr != 0) throw Marshal.GetExceptionForHR(hr); g.ReleaseHdc(hdc); } //сохранение в PNG bmp.Save(outpath, System.Drawing.Imaging.ImageFormat.Png); } finally { //освобождение ресурсов if (d2 != null) Marshal.ReleaseComObject(d2); if (pObj != null) Marshal.ReleaseComObject(pObj); if (pView != null) Marshal.ReleaseComObject(pView); if (doc != null) Marshal.ReleaseComObject(doc); } } [DllImport("gdi32.dll")] static extern int GetDeviceCaps(IntPtr hdc, int nIndex); [DllImport("user32.dll")] static extern IntPtr GetDC(IntPtr hWnd); [DllImport("user32.dll")] static extern bool SystemParametersInfo(int nAction, int nParam, ref RECTL rc, int nUpdate); public static int MulDiv(int number, int numerator, int denominator) { return (int)(((long)number * numerator) / denominator); } const int LOGPIXELSX = 88; const int LOGPIXELSY = 90; const int HIMETRIC_INCH = 2540; const int SPI_GETWORKAREA = 48; } [ComImport()] [GuidAttribute("0000010d-0000-0000-C000-000000000046")] [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] public interface IViewObject { int Draw([MarshalAs(UnmanagedType.U4)] int dwDrawAspect, int lindex, IntPtr pvAspect, IntPtr ptd, IntPtr hdcTargetDev, IntPtr hdcDraw, ref RECTL lprcBounds, IntPtr lprcWBounds, IntPtr pfnContinue, int dwContinue); int a(); int b(); int c(); int d(); int e(); } [ComImport()] [Guid("00000112-0000-0000-C000-000000000046")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IOleObject { void f(); void g(); void SetHostNames(object szContainerApp, object szContainerObj); void Close(uint dwSaveOption); void SetMoniker(uint dwWhichMoniker, object pmk); void GetMoniker(uint dwAssign, uint dwWhichMoniker, object ppmk); void x(); void y(); void DoVerb(uint iVerb, uint lpmsg, object pActiveSite, uint lindex, uint hwndParent, uint lprcPosRect); void EnumVerbs(ref object ppEnumOleVerb); void Update(); void IsUpToDate(); void GetUserClassID(uint pClsid); void GetUserType(uint dwFormOfType, uint pszUserType); int SetExtent(uint dwDrawAspect, ref SIZEL psizel); void GetExtent(uint dwDrawAspect, uint psizel); void Advise(object pAdvSink, uint pdwConnection); void Unadvise(uint dwConnection); void EnumAdvise(ref object ppenumAdvise); void GetMiscStatus(uint dwAspect, uint pdwStatus); void SetColorScheme(object pLogpal); }; public struct RECTL { public uint left; public uint top; public uint right; public uint bottom; } public struct SIZEL { public uint x; public uint y; } } 用法: string svgcontent = "<svg><circle cx=\"200\" cy=\"200\" r=\"150\" stroke=\"red\" fill=\"green\" stroke-width=\"10\"/></svg>"; SvgConvert.ToPng(svgcontent,"c:\\test\\svgimage.png"); 来源:使用 IE 将 SVG 作为位图保存到任何位置
C# 的SVG库。
像这样工作:
不需要从NuGet拿包,因为版本比较老,bug很多,直接hot,要从github下载编译。
该项目正在运行、支持和开发,但事实证明,开发人员正在逐步消除一些错误。
该库不仅允许渲染现成的 SVG 文件,还允许使用其 API 动态创建它。
1. 使用Inkscape的方法。
从命令行运行以下命令
在这种情况下,
inskape我在系统路径中注册了它们。事实证明,
Inkscape并非所有在浏览器中工作的文件都可以转换。href为了正确操作,必须将y属性use替换为 withxlink:href并将其写入 head 标签svgxmlns:xlink="http://www.w3.org/1999/xlink"中。2.使用node.js模块svgexport的方法
全局安装svgexport模块
从控制台运行命令
这种方法的优势在于它使用基于模块
node.js svgexport的浏览器引擎进行渲染,这意味着结果将与基础浏览器中的显示最接近。此外,可以最大限度地使用浏览器语法。phantom.jsWebKitChromium这种方法的缺点是在处理带有俄文名称的路径时,转换命令会出错,因此所有文件都必须放在英文目录中。
您可以在此处和此处阅读更多详细信息。
添加:
在 github 上阅读问题后,我意识到路径不起作用,很可能是由于路径中存在空格。
如果您有 Internet Explorer 11,则可以使用 MSHTML COM 对象:
用法:
来源:使用 IE 将 SVG 作为位图保存到任何位置