关于.net:使用C#将SVG转换为PNG

关于.net:使用C#将SVG转换为PNG

Converting SVG to PNG using C#

我一直在尝试使用C#将SVG图像转换为PNG,而不必编写太多代码。 有人可以推荐这样做的库或示例代码吗?


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

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

还有一个C#SVG呈现引擎,主要设计为允许SVG文件在网络上在Codeplex上使用,如果这是您的问题,它可能会满足您的需求:

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

具有修复功能和更多活动的叉子:(7/2013新增)
https://github.com/vvvv/SVG


使用库http://svg.codeplex.com/(新版本@ GIT,@ NuGet)有一种更简单的方法。这是我的代码

1
2
3
4
5
6
7
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);
}


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[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());
    }
}

我为此使用蜡染。完整的Delphi代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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;

要添加到@Anish的响应中,如果您在将SVG导出到图像时遇到看不到文本的问题,则可以创建一个递归函数以遍历SVGDocument的子代,尝试将其强制转换为SvgText可能(添加您自己的错误检查)并设置字体系列和样式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    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


推荐阅读

    linux命令行输入汉字?

    linux命令行输入汉字?,系统,软件,发行,管理,终端,命令,模式,编辑,文件,文本,L

    linux命令行重命名?

    linux命令行重命名?,图片,名字,名称,软件,代码,文件,命令,文件名,批量,方面,L

    linux命令行3中文?

    linux命令行3中文?,工作,地址,系统,信息,标准,命令,目录,网上,功能,内核,linu

    linux命令行进入图文?

    linux命令行进入图文?,系统,密码,终端,电脑,网络,传播,情况,图形界面,命令,

    linux命令行交互界面?

    linux命令行交互界面?,系统,密码,状态,终端,信息,工具,环境,情况,首页,界面,l

    linux怎么调用命令行?

    linux怎么调用命令行?,系统,地址,工具,工作,首页,终端,命令,密码,信息,情况,l

    linux命令行权限不够?

    linux命令行权限不够?,档案,系统,权限,密码,文件,命令,终端,目录,文件名,用

    linux查看命令行进程?

    linux查看命令行进程?,系统,软件,信息,状态,进程,名称,实时,命令,数据,电脑,

    linux常用命令行工具?

    linux常用命令行工具?,系统,工作,工具,地址,管理,信息,命令,软件,目录,基础,l

    linux常见操作命令?

    linux常见操作命令?,系统,工作,信息,管理,地址,命令,目录,单位,数据,标准,lin

    linux命令行如何复制?

    linux命令行如何复制?,位置,系统,文件,命令,目录,工作,源文件,目标,文件名,

    linux命令行打印图标?

    linux命令行打印图标?,系统,信息,工具,服务,环境,地方,数字,网络,工作,命令,l

    linux获取ip命令行?

    linux获取ip命令行?,地址,系统,网络,信息,技术,设备,电脑,服务,手机,管理,配

    linux命令行关闭网页?

    linux命令行关闭网页?,服务,系统,状态,管理,命令,进程,文件,模式,指令,主机,l

    linux启动显示命令行?

    linux启动显示命令行?,系统,密码,终端,状态,首页,情况,基础,电脑,信息,工具,l

    linux下执行命令行?

    linux下执行命令行?,工作,系统,信息,单位,命令,基础,地址,设备,权威,标准,mv

    linux退出文件命令行?

    linux退出文件命令行?,状态,档案,命令,电脑,编辑,文件,模式,界面,指令,键盘,l

    linux上上传命令行?

    linux上上传命令行?,服务,密码,百度,工具,文件,系统,位置,工作,地址,官网,怎

    linux常规的命令行?

    linux常规的命令行?,系统,工作,地址,信息,命令,时间,情况,终端,目录,功能,lin

    linux命令行网络流量?

    linux命令行网络流量?,工具,系统,信息,网络,实时,状态,代码,服务,联通,号码,