C#を使用したSVGからPNGへの変換[終了]


102

私は、C#を使用して、SVG画像をPNGに変換しようとしましたが、あまり多くのコードを記述する必要はありません。誰もがこれを行うためのライブラリまたはサンプルコードを推奨できますか?


私はあなたがc#github.com/ElinamLLC/SharpVectorsで使用できる良いシンプルなライブラリを見つけました、それは多くのタイプのsvgをbmp、jpegまたはpngに変換できます
Mahdi

2
wkhtml2pdf / wkhtml2imageなど、これらのソリューションは悪いです。SVG仕様は複雑で進化しているため、CSSスタイルもそうであり、その上、ブラウザーと同じように見えるはずです。たとえば、wkhtml2Xにはフォントに関する大きな問題があり、内部のWebkitエンジンは古すぎます。幸いなことに、解決策があります。Chromeにはヘッドレスモードがあり、そのDebugging-APIを使用すると、C#のMasterDevs / ChromeDevToolsを使用して、ヘッドレスChrome自体からPNG画像とPDFを取得できます。例:github.com/ststeiger/ChromeDevTools / blob / master / source /…
Stefan Steiger

回答:


68

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

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

また、C#SVGレンダリングエンジンもあり、主にSVGファイルをcodeplex上のWebで使用できるように設計されています。

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

修正とより多くの活動を伴うフォーク:(2013年7月追加)
https://github.com/vvvv/SVG


39
Espoに感謝します。私は実際にそのインクスケープのブログ投稿を書いた!「機能」しますが、特に堅牢なソリューションではありません。でも私はcodeplexプロジェクトが好きです-見てみましょう。ありがとう。
ハリヨット2008

9
どのように恥ずかしい:)良いことかもしれませんが、SVGレンダリングエンジンがあなたを助けるかもしれません。
Espo

20
私はそれを褒め言葉として受け取ります。私はこれまで自分に言われたことがありません!
ハリヨット2008

svgレンダリングエンジンを試しましたか?ソリューションプラザを共有できますか。イムそれ仕事にしようとしたがトラブルが、持っここを参照してください
Armance

1
私はgithub.com/vvvv/SVGを試しましたが、動作しますが、特定の制限があります。image要素が実装されていない-私は、ソースコードをチェックします。@FrankHaleラファエルがそれを2回追加したので、svgからxmlnsを削除しなければなりませんでした。
fireydude 2013年

74

ライブラリ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);
}

1
githubバージョンを使用する必要があったのは、それが最新であり、それもimage要素をサポートしていないためです。
fireydude 2013年

私はこのコードから使用され、object not set to an instance of an object実行したいときにスローしvar bitmap = svgDocument.Draw();ます。どうしたの?
Rasool Ghafari、2015

@RasoolGhafariは、svgDocumentがnullでないことを確認してください。
アニッシュ2015

svgDocumentがnullではありません。これは、ライブラリのある種の内部問題です。
ジョナサンアレン

@JonathanAllen、私はRasoolのコメントに答えていました。
アニッシュ

12

サーバーでsvgをラスタライズする必要があったとき、私は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());
    }
}

1
librSVGは悪くありませんが、フォント/テキスト、それらを正しく処理しません。:代わりに、ヘッドレス・クロム、クロム-デバッグAPIを見て、とクロムのデバッグAPIのためのC#のAPI取る github.com/ststeiger/ChromeDevTools/blob/master/source/...
ステファン・スタイガー

8

私はこれにバティックを使用しています。完全な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;

@downvoters-なぜ反対票を投じたのか説明してください。説明のない反対票の価値はゼロです。
stevenvh 2016

4
「c#」が含まれている質問テキストから反対票が出ていると思います。そして、あなたの提案はデルファイです
デニス

反対投票はしませんでしたが、回答を編集してBatik、C#または任意の言語から呼び出すことができるJavaライブラリであることを明確にすることができます(この場合は、Delphiで呼び出す方法を示しました)
ErrCode

新しいプロセスの開始は遅いです。また、バティックはどのように正しくラスタライズされますか?最新のバイナリは入手が困難です。そのがらくたを我慢する代わりに、headless -chrome、chrome-debugging API、およびchrome-debugging APIのC#APIを見てください: github.com/ststeiger/ChromeDevTools/blob/master/source/…-すべての人Javaユーザー、私はきっとChromeのデバッグAPIの周りにJava APIもあると思います。
Stefan Steiger、

4

@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
        {

        }
    }

質問があれば教えてください。


parentはSetFontで定義されていません。要素であるか、関数シグネチャで要素変数の名前をparentに変更する必要があります
Norbert Kardos

また、フォントは文字列のようです。しかし、これは命の恩人でした、ありがとう!
Norbert Kardos

-3

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.