Conversion SVG en PNG en utilisant C# [fermé]
6 réponses
vous pouvez appeler la version en ligne de commande d'inkscape pour faire ceci:
http://harriyott.com/2008/05/converting-svg-images-to-png-in-c.aspx
il y a aussi un moteur de rendu C# SVG, principalement conçu pour permettre aux fichiers SVG D'être utilisés sur le web sur codeplex qui pourraient convenir à vos besoins si tel est votre problème:
Projet Initial
http://www.codeplex.com/svg
fourche avec fixations et plus d'activité: (ajouté 7/2013)
https://github.com/vvvv/SVG
il est beaucoup plus facile d'utiliser la bibliothèque http://svg.codeplex.com / (nouvelle version @ GIT , @ NuGet ). Voici mon code
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);
}
quand j'ai dû rastérider les SVG sur le serveur, j'ai fini par utiliser P/Invoke pour appeler les fonctions librsvg (vous pouvez obtenir les dlls à partir d'une version windows du programme d'édition d'image 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());
}
}
j'utilise batik pour ceci. Le code Delphi complet:
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;
pour ajouter à la réponse de @Anish, si vous avez des problèmes avec le fait de ne pas voir le texte lors de l'exportation du SVG vers une image, vous pouvez créer une fonction récursive pour passer en boucle à travers les enfants du SVGDocument, essayer de le lancer dans un SvgText si possible (ajouter votre propre vérification d'erreur) et définir la famille de polices et le style.
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
{
}
}
dites-moi s'il y a des questions.