تحويل SVG إلى PNG باستخدام C# [مغلق]
سؤال
لقد كنت أحاول تحويل صور 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 لهذا الغرض