سؤال

لقد كنت أحاول تحويل صور SVG إلى PNG باستخدام C#، دون الحاجة إلى كتابة الكثير من التعليمات البرمجية.هل يمكن لأي شخص أن يوصي بمكتبة أو رمز مثال للقيام بذلك؟

هل كانت مفيدة؟

المحلول

يمكنك استدعاء إصدار سطر الأوامر من إنكسكيب للقيام بذلك:

http://harriyott.com/2008/05/converting-svg-images-to-png-in-c.aspx

يوجد أيضًا محرك عرض C# SVG، مصمم بشكل أساسي للسماح باستخدام ملفات SVG على الويب على codeplex والذي قد يناسب احتياجاتك إذا كانت هذه هي مشكلتك:

المشروع الأصلي
http://www.codeplex.com/svg

شوكة مع الإصلاحات والمزيد من النشاط: (أضيفت في 7/2013)
https://github.com/vvvv/SVG

نصائح أخرى

هناك طريقة أسهل بكثير لاستخدام المكتبة http://svg.codeplex.com/ (إصدار أحدث @شخص سخيف, @نوجيت).هنا هو الكود الخاص بي

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/Invoc لاستدعاء وظائف librsvg (يمكنك الحصول على ملفات dll من إصدار Windows لبرنامج تحرير الصور 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());
    }
}

أنا استخدم الباتيك لهذا.كود دلفي الكامل:

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;

للإضافة إلى الرد من @Anish، إذا كنت تواجه مشكلات تتعلق بعدم رؤية النص عند تصدير SVG إلى صورة، فيمكنك إنشاء وظيفة متكررة للتكرار عبر العناصر الفرعية لـ SVGDocument، وحاول إرسالها إلى SvgText إذا ممكن (أضف التحقق من الأخطاء الخاص بك) وقم بتعيين عائلة الخط ونمطه.

    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
        {

        }
    }

اسمحوا لي أن أعرف إذا كانت هناك أسئلة.

يمكنك استخدام altsoft xml2pdf lib لهذا الغرض

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top