ฉันพยายามแปลงภาพ SVG เป็น PNG โดยใช้ C # โดยไม่ต้องเขียนโค้ดมากเกินไป ใครช่วยแนะนำไลบรารีหรือโค้ดตัวอย่างสำหรับการทำสิ่งนี้ได้บ้าง
ฉันพยายามแปลงภาพ SVG เป็น PNG โดยใช้ C # โดยไม่ต้องเขียนโค้ดมากเกินไป ใครช่วยแนะนำไลบรารีหรือโค้ดตัวอย่างสำหรับการทำสิ่งนี้ได้บ้าง
คำตอบ:
คุณสามารถเรียกใช้ inkscape เวอร์ชันบรรทัดคำสั่งเพื่อทำสิ่งนี้:
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
image
องค์ประกอบยังไม่ได้รับการดำเนินการ - ฉันจะตรวจสอบรหัสที่มา @ FrankHale ฉันต้องลบ xmlns ออกจาก svg เพราะ raphael เพิ่มสองครั้ง
มีวิธีที่ง่ายกว่ามากในการใช้ไลบรารี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);
}
image
องค์ประกอบ
object not set to an instance of an object
var bitmap = svgDocument.Draw();
มีปัญหาอะไร?
เมื่อฉันต้องแรสเตอร์ขนาด svgs บนเซิร์ฟเวอร์ฉันลงเอยด้วยการใช้ P / Invoke เพื่อเรียกใช้ฟังก์ชัน librsvg (คุณสามารถรับ dlls จากโปรแกรมแก้ไขภาพ GIMP เวอร์ชัน Windows)
[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());
}
}
ฉันใช้ผ้าบาติกสำหรับสิ่งนี้ รหัส 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;
Batik
เป็นไลบรารี Java ที่คุณสามารถเรียกใช้จาก C # หรือภาษาอะไรก็ได้ (ในกรณีนี้คุณแสดงวิธีเรียกมันใน Delphi)
หากต้องการเพิ่มการตอบกลับจาก @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 สำหรับสิ่งนี้