我一直在尝试使用C#将SVG图像转换为PNG,而不必编写太多代码.有人可以推荐一个库或示例代码来执行此操作吗?
您可以调用inkscape的命令行版本来执行此操作:
http://harriyott.com/2008/05/converting-svg-images-to-png-in-c.aspx
此外,还有一个C#SVG渲染引擎,主要用于允许SVG文件在可能适合您需要的codeplex上的Web上使用,如果这是您的问题:
原始项目
http://www.codeplex.com/svg
分叉修复和更多活动:(已添加7/2013)
https://github.com/vvvv/SVG
使用库http://svg.codeplex.com/(较新版本@ GIT,@ NuGet)有一种更简单的方法.这是我的代码
var byteArray = Encoding.ASCII.GetBytes(svgFileContents); using (var stream = new MemoryStream(byteArray)) { var svgDocument = SvgDocument.Open(stream); var bitmap = svgDocument.Draw(); bitmap.Save(path, ImageFormat.Png); }
当我不得不在服务器上光栅化svgs时,我最终使用P/Invoke来调用librsvg函数(你可以从Windows版本的GIMP图像编辑程序中获取dll).
[DllImport("kernel32.dll", SetLastError = true)] static extern bool SetDllDirectory(string pathname); [DllImport("libgobject-2.0-0.dll", SetLastError = true)] static extern void g_type_init(); [DllImport("librsvg-2-2.dll", SetLastError = true)] static extern IntPtr rsvg_pixbuf_from_file_at_size(string file_name, int width, int height, out IntPtr error); [DllImport("libgdk_pixbuf-2.0-0.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] static extern bool gdk_pixbuf_save(IntPtr pixbuf, string filename, string type, out IntPtr error, __arglist); public static void RasterizeSvg(string inputFileName, string outputFileName) { bool callSuccessful = SetDllDirectory("C:\\Program Files\\GIMP-2.0\\bin"); if (!callSuccessful) { throw new Exception("Could not set DLL directory"); } g_type_init(); IntPtr error; IntPtr result = rsvg_pixbuf_from_file_at_size(inputFileName, -1, -1, out error); if (error != IntPtr.Zero) { throw new Exception(Marshal.ReadInt32(error).ToString()); } callSuccessful = gdk_pixbuf_save(result, outputFileName, "png", out error, __arglist(null)); if (!callSuccessful) { throw new Exception(error.ToInt32().ToString()); } }
我正在使用Batik.完整的Delphi代码:
procedure ExecNewProcess(ProgramName : String; Wait: Boolean); var StartInfo : TStartupInfo; ProcInfo : TProcessInformation; CreateOK : Boolean; begin FillChar(StartInfo, SizeOf(TStartupInfo), #0); FillChar(ProcInfo, SizeOf(TProcessInformation), #0); StartInfo.cb := SizeOf(TStartupInfo); CreateOK := CreateProcess(nil, PChar(ProgramName), nil, nil, False, CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS, nil, nil, StartInfo, ProcInfo); if CreateOK then begin //may or may not be needed. Usually wait for child processes if Wait then WaitForSingleObject(ProcInfo.hProcess, INFINITE); end else ShowMessage('Unable to run ' + ProgramName); CloseHandle(ProcInfo.hProcess); CloseHandle(ProcInfo.hThread); end; procedure ConvertSVGtoPNG(aFilename: String); const ExecLine = 'c:\windows\system32\java.exe -jar C:\Apps\batik-1.7\batik-rasterizer.jar '; begin ExecNewProcess(ExecLine + aFilename, True); end;