Frage

Ich habe versucht, SVG-Bilder in PNG-Dateien zu konvertieren mit C #, ohne zu viel Code zu schreiben. Kann mir jemand eine Bibliothek oder Beispielcode empfehlen, dies zu tun?

War es hilfreich?

Lösung

können Sie rufen die Befehlszeilenversion von inkscape, dies zu tun:

http://harriyott.com/ 2008/05 / Umwandlung-svg-Bilder-to-png-in-c.aspx

Auch gibt es ein C # SVG Rendering-Engine, in erster Linie entwickelt, SVG-Dateien zu ermöglichen, die im Internet auf Codeplex zu verwenden, die Ihre Bedürfnisse passen könnten, wenn das Ihr Problem ist:

Original Projekt
http://www.codeplex.com/svg

Gabel mit Fixes und mehr Aktivität: (hinzugefügt 7/2013)
https://github.com/vvvv/SVG

Andere Tipps

Es gibt eine viel einfachere Möglichkeit, die Bibliothek http://svg.codeplex.com/ (Neuere Version @ GIT , @ NuGet ). Hier ist mein Code

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

Als ich hatte SVGs auf dem Server rastern, ich landete mit P / Invoke-Funktionen aufzurufen librsvg (Sie können die DLLs aus einer Windows-Version von GIMP Bildbearbeitungsprogramm bekommen).

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

Ich bin mit Batik für diese. Der komplette Delphi-Code:

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;

auf die Antwort von @Anish hinzuzufügen, wenn Sie Probleme haben mit dem Text nicht sehen, wenn die SVG zu einem Bild exportieren, können Sie eine rekursive Funktion einer Schleife durch die Kinder des SVGDocument zu schaffen, versuchen Sie es zu gieße ein SvgText wenn möglich (eigene Fehlerprüfung hinzufügen) und die Schriftfamilie und Stil.

    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
        {

        }
    }

Lassen Sie mich wissen, wenn es Fragen gibt.

Sie können Altsoft XML2PDF lib für diese verwenden

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top