C# 使用C语言将SVG转换为PNG#

C# 使用C语言将SVG转换为PNG#,c#,.net,png,svg,C#,.net,Png,Svg,我一直在尝试使用C#将SVG图像转换为PNG,而不必编写太多代码。有人可以推荐一个库或示例代码来执行此操作吗?您可以调用inkscape的命令行版本来执行此操作: 另外还有一个C#SVG渲染引擎,主要设计用于允许在codeplex上的web上使用SVG文件,如果这是您的问题,它可能适合您的需要: 原始项目 具有修复和更多活动的Fork:(于2013年7月添加) 我正在使用它。完整的Delphi代码: procedure ExecNewProcess(ProgramName : String;

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

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

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

原始项目

具有修复和更多活动的Fork:(于2013年7月添加)

我正在使用它。完整的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;

您可以使用altsoft xml2pdf lib进行此操作

当我必须在服务器上光栅化SVG时,我最终使用p/Invoke调用librsvg函数(您可以从windows版本的GIMP图像编辑程序中获取DLL)


有一种更简单的方法可以使用库(更新版本@)。这是我的密码

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

要添加到@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
        {

        }
    }


如果有问题,请告诉我。

谢谢Espo。我真的写了那篇inkscape博客文章!尽管它“有效”,但它并不是一个特别健壮的解决方案。不过我喜欢codeplex项目——我会看一看。谢谢。多么尴尬:)幸好SVG渲染引擎可以帮你解决这个问题。我认为这是一种恭维。我以前从未被引用过!你试过svg渲染引擎吗?你能分享你的解决方案吗。我试图让它工作,但有麻烦,我已经尝试过,它的工作,但有一定的局限性。
image
元素尚未实现-我检查了源代码@FrankHale我不得不从svg中删除一个xmlns,因为raphael添加了两次。我不得不使用github版本,因为它更为最新,甚至不支持
image
元素。我是从这段代码中使用的,当想要执行
var bitmap=svgDocument.Draw时,它会抛出未设置为对象实例的
对象();
。有什么问题?@RasoolGhafari确保你的svgDocument不为null。svgDocument不为null。这是库中的某种内部问题。@Jonathanalen,我在回答Rasool的评论。@downvoters-请解释你为什么否决。没有解释的否决票是零值的。我猜否决票来自问题text中包含“c#”,您的提案没有否决,但您可以编辑您的答案,并明确说明
Batik
是一个Java库,您可以从c#或任何语言调用它(在本例中,您演示了如何在Delphi中调用它)开始一个新的过程是缓慢的。另外,蜡染光栅化的正确程度如何?很难获得最新的二进制文件。与其忍受这些废话,不如看看无头chrome、chrome调试API和chrome调试API的C#API:-对于所有Java用户,我确信chrome的调试API周围也有Java API。我发现了一个很好的您可以在c#中使用的简单库,它可以将多种类型的svg转换为bmp、jpeg或pngMay。我说:这些解决方案很糟糕,包括wkhtml2pdf/wkhtml2image等。svg规范复杂且不断发展,CSS样式也是如此,除此之外,它应该与浏览器中的样式相同。例如,WKHTMLL2X在字体方面存在大量问题幸运的是,有一个解决方案:Chrome具有headless模式,通过其调试API,您可以使用C#中的MasterDevs/ChromeDevTools从headless Chrome自身获取PNG图像和PDF:示例:在SetFont中未定义parent,应为element或将element变量重命名为parentAction SignatureAllo字体现在似乎是一个字符串。不过这是一个救星,谢谢!librSVG不错,但是字体/文本,它不能正确处理它们。相反,请看一下无头chrome、chrome调试API和chrome调试API的C#API:
    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
        {

        }
    }