Saya sudah mencoba mengonversi gambar SVG ke PNG menggunakan C #, tanpa harus menulis terlalu banyak kode. Adakah yang bisa merekomendasikan perpustakaan atau kode contoh untuk melakukan ini?
Saya sudah mencoba mengonversi gambar SVG ke PNG menggunakan C #, tanpa harus menulis terlalu banyak kode. Adakah yang bisa merekomendasikan perpustakaan atau kode contoh untuk melakukan ini?
Jawaban:
Anda dapat memanggil versi baris perintah inkscape untuk melakukan ini:
http://harriyott.com/2008/05/converting-svg-images-to-png-in-c.aspx
Juga ada mesin rendering C # SVG, terutama dirancang untuk memungkinkan file SVG digunakan di web pada codeplex yang mungkin sesuai dengan kebutuhan Anda jika itu adalah masalah Anda:
Proyek Asli
http://www.codeplex.com/svg
Bercabang dengan perbaikan dan lebih banyak aktivitas: (ditambahkan 7/2013)
https://github.com/vvvv/SVG
image
elemen belum dilaksanakan - aku memeriksa kode sumber. @FrankHale Saya harus menghapus xmlns dari svg karena raphael menambahkannya dua kali.
Ada cara yang jauh lebih mudah menggunakan perpustakaan http://svg.codeplex.com/ (Versi terbaru @ GIT , @ NuGet ). Ini kode saya
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
elemen tersebut.
object not set to an instance of an object
ketika ingin mengeksekusi var bitmap = svgDocument.Draw();
. apa masalahnya?
Ketika saya harus meraster svgs di server, saya akhirnya menggunakan P / Invoke untuk memanggil fungsi librsvg (Anda bisa mendapatkan dll dari versi windows dari program pengeditan gambar 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());
}
}
Saya menggunakan Batik untuk ini. Kode Delphi lengkap:
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
adalah pustaka Java yang dapat Anda panggil dari C # atau bahasa apa pun (dalam hal ini Anda menunjukkan cara memanggilnya dalam Delphi)
Untuk menambahkan respons dari @Anish, jika Anda mengalami masalah dengan tidak melihat teks saat mengekspor SVG ke gambar, Anda dapat membuat fungsi rekursif untuk mengulang melalui turunan SVGDocument, coba transmisikan ke SvgText jika mungkin (tambahkan pemeriksaan kesalahan Anda sendiri) dan atur keluarga dan gaya font.
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
{
}
}
Beri tahu saya jika ada pertanyaan.
Anda dapat menggunakan lib altsoft xml2pdf untuk ini