Tôi đã cố gắng chuyển đổi ảnh SVG sang PNG bằng C # mà không cần phải viết quá nhiều mã. Bất cứ ai có thể giới thiệu một thư viện hoặc mã ví dụ để làm điều này?
Tôi đã cố gắng chuyển đổi ảnh SVG sang PNG bằng C # mà không cần phải viết quá nhiều mã. Bất cứ ai có thể giới thiệu một thư viện hoặc mã ví dụ để làm điều này?
Câu trả lời:
Bạn có thể gọi phiên bản dòng lệnh của inkscape để thực hiện việc này:
http://harriyott.com/2008/05/converting-svg-images-to-png-in-c.aspx
Ngoài ra, có một công cụ kết xuất C # SVG, được thiết kế chủ yếu để cho phép các tệp SVG được sử dụng trên web trên codeplex có thể phù hợp với nhu cầu của bạn nếu đó là vấn đề của bạn:
Dự án gốc
http://www.codeplex.com/svg
Fork với các bản sửa lỗi và hoạt động khác: (thêm 7/2013)
https://github.com/vvvv/SVG
image
tử chưa được triển khai - Tôi đã kiểm tra mã nguồn. @FrankHale Tôi đã phải xóa xmlns khỏi svg vì raphael đã thêm nó hai lần.
Có một cách dễ dàng hơn nhiều là sử dụng thư viện http://svg.codeplex.com/ (Phiên bản mới hơn @ GIT , @ NuGet ). Đây là mã của tôi
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
phần tử.
object not set to an instance of an object
khi muốn thực thi var bitmap = svgDocument.Draw();
. có vấn đề gì
Khi tôi phải sắp xếp lại các svgs trên máy chủ, tôi đã kết thúc bằng cách sử dụng P / Invoke để gọi các hàm librsvg (bạn có thể lấy dlls từ phiên bản windows của chương trình chỉnh sửa hình ảnh 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());
}
}
Tôi đang sử dụng Batik cho việc này. Mã Delphi hoàn chỉnh:
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
là một thư viện Java mà bạn có thể gọi từ C # hay bất cứ ngôn ngữ (trong trường hợp này, bạn thấy làm thế nào để gọi nó trong Delphi)
Để thêm vào phản hồi từ @Anish, nếu bạn gặp sự cố không nhìn thấy văn bản khi xuất SVG sang một hình ảnh, bạn có thể tạo một hàm đệ quy để lặp qua các phần tử con của SVGDocument, thử truyền nó sang SvgText nếu có thể (thêm kiểm tra lỗi của riêng bạn) và đặt họ phông chữ và kiểu.
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
{
}
}
Hãy cho tôi biết nếu có câu hỏi.
bạn có thể sử dụng altsoft xml2pdf lib cho việc này