当前位置:  开发笔记 > 编程语言 > 正文

使用C#将SVG转换为PNG

如何解决《使用C#将SVG转换为PNG》经验,为你挑选了4个好方法。

我一直在尝试使用C#将SVG图像转换为PNG,而不必编写太多代码.有人可以推荐一个库或示例代码来执行此操作吗?



1> Espo..:

您可以调用inkscape的命令行版本来执行此操作:

http://harriyott.com/2008/05/converting-svg-images-to-png-in-c.aspx

此外,还有一个C#SVG渲染引擎,主要用于允许SVG文件在可能适合您需要的codeplex上的Web上使用,如果这是您的问题:

原始项目
http://www.codeplex.com/svg

分叉修复和更多活动:(已添加7/2013)
https://github.com/vvvv/SVG


谢谢Espo.我实际写了那个inkscape博客文章!虽然它"有效",但它并不是一个特别强大的解决方案.我喜欢codeplex项目 - 我会看一看.谢谢.
我认为这是一种恭维.我之前没有被引用过!
多么令人尴尬:)好东西也许SVG渲染引擎可以帮助你.

2> Anish..:

使用库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);
}



3> nw...:

当我不得不在服务器上光栅化svgs时,我最终使用P/Invoke来调用librsvg函数(你可以从Windows版本的GIMP图像编辑程序中获取dll).

[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());
    }
}



4> stevenvh..:

我正在使用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;


我想downvotes来自问题文本,其中包含"c#".你的提议是delphi
推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有