c# .net png svg

Convirtiendo SVG a PNG usando C#



.net (6)

Cuando tuve que rasterizar svgs en el servidor, terminé usando P / Invoke para llamar a las funciones de librsvg (puede obtener los dlls de una versión de Windows del programa de edición de imágenes GIMP).

[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()); } }

He intentado convertir imágenes SVG a PNG usando C #, sin tener que escribir demasiado código. ¿Alguien puede recomendar una biblioteca o código de ejemplo para hacer esto?


Estoy usando Batik para esto. El código completo de 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;


Hay una manera mucho más fácil usando la biblioteca http://svg.codeplex.com/ (Versión más nueva @ https://github.com/vvvv/SVG , @ NuGet ). Aquí está mi código

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); }


Para agregar a la respuesta de @Anish, si tiene problemas para no ver el texto al exportar el SVG a una imagen, puede crear una función recursiva para recorrer los elementos secundarios del SVGDocument, intente convertirlo a un SvgText si posible (agregue su propia comprobación de errores) y configure la familia de fuentes y el estilo.

foreach(var child in svgDocument.Children) { SetFont(child); } public void SetFont(SvgElement element) { foreach(var child in element.Children) { SetFont(child); //Call this function again with the child, this will loop //until the element has no more children } try { var svgText = (SvgText)parent; //try to cast the element as a SvgText //if it succeeds you can modify the font svgText.Font = new Font("Arial", 12.0f); svgText.FontSize = new SvgUnit(12.0f); } catch { } }

Avíseme si hay preguntas.



puedes usar altsoft xml2pdf lib para esto