111

コードをあまり書かなくても、C# を使用して SVG 画像を PNG に変換しようとしています。これを行うためのライブラリまたはサンプルコードを推奨できる人はいますか?

4

6 に答える 6

87

ライブラリ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);
}
于 2012-10-14T16:54:14.533 に答える
71

これを行うには、inkscape のコマンドライン バージョンを呼び出すことができます。

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

また、C# SVG レンダリング エンジンもあります。これは主に、SVG ファイルを Web 上の codeplex で使用できるようにすることを目的として設計されており、それが問題である場合にニーズに合う可能性があります。

元のプロジェクト
http://www.codeplex.com/svg

修正とその他のアクティビティを伴うフォーク: (2013 年 7 月に追加)
https://github.com/vvvv/SVG

于 2008-09-12T13:11:39.043 に答える
12

サーバー上で svgs をラスタライズする必要があったとき、P/Invoke を使用して librsvg 関数を呼び出すことになりました (GIMP 画像編集プログラムの Windows バージョンから 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());
    }
}
于 2011-08-09T22:25:02.430 に答える
4

@Anish からの応答に追加するには、SVG を画像にエクスポートするときにテキストが表示されないという問題がある場合は、SVGDocument の子をループする再帰関数を作成できます。可能 (独自のエラー チェックを追加) し、フォント ファミリとスタイルを設定します。

    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
        {

        }
    }

質問がある場合はお知らせください。

于 2013-02-14T16:04:43.360 に答える
-4

これにはaltsoft xml2pdf libを使用できます

于 2009-02-24T21:45:17.203 に答える