Я намагався перетворити SVG-зображення в PNG за допомогою C #, не записуючи занадто багато коду. Хтось може порекомендувати для цього бібліотеку чи приклад коду?
Я намагався перетворити SVG-зображення в PNG за допомогою C #, не записуючи занадто багато коду. Хтось може порекомендувати для цього бібліотеку чи приклад коду?
Відповіді:
Ви можете викликати версію командного рядка inkscape, щоб зробити це:
http://harriyott.com/2008/05/converting-svg-images-to-png-in-c.aspx
Також є механізм візуалізації C # SVG, розроблений головним чином, щоб дозволити використання файлів SVG в Інтернеті в кодеплексі, що може відповідати вашим потребам, якщо це ваша проблема:
Оригінальний проект
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 (ви можете отримати 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());
}
}
Я використовую для цього Batik . Повний код 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