GDI のメモリ DC で書いたオフスクリーンの内容で画像ファイルを作成するという方法はよく知られていると思います。これを WPF ではどうするのだろうと思って試してみました。
描画
まずは画像作成元となるものを作ります。 WPF では RenderTargetBitmap というクラスがあり、これを使うと保持している内容をビットマップとして取得が出来ます。
ただ、この RenderTargetBitmap に対して直接、直線や円を描く、というものではありません。Canvas オブジェクトを使って、Canvas に中身を描いて、この Canvas を RenderTargetBitmap にセットするというのが手軽に図形を描画する方法といえそうです。
コード例
// キャンバスの用意 var canvas = new Canvas(); canvas.Width = 256; canvas.Height = 256; canvas.Background = new SolidColorBrush(Colors.White); // 四角形をかく var rectangle = new Rectangle(); rectangle.Width = 50; rectangle.Height= 50; rectangle.Stroke = new SolidColorBrush(Colors.Black); rectangle.StrokeThickness = 1; canavs.Children.Add(rectangle);
保存について
作成した Canvas を保持する RenderTargetBitmap を経由して、画像ファイルを作成します。
ここでは PNG 形式で保存する例を紹介します。
コード例
var renderBitmap = new RenderTargetBitmap( (int)canvas.Width, (int)canvas.Height, 96, 96, PixelFormats.Pbgra32); renderBitmap.Render(canvas); using (var fs = new FileStream(path, FileMode.Create)) { var encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(renderBitmap)); encoder.Save(fs); }
もし、画像の形式を変える場合には BitmapEncoder を他のものに交換すれば良いと思います。
おまけ
単純な図形らでそれなりに見慣れているものということで、リポジトリのコミットログについて試しに描画、保存してみました。
以下の図は libgit2 リポジトリのコミットログをこの WPF で描画して保存してみたものです。
確認すると分かるのですが、丸や斜線部分にアンチエイリアスも効いてなめらかに描画されていました。
GDI のころとあまり変わらない手数で図形を描いて保存というのは出来たかな、と思います。