WPF で .NET アプリケーションを開発したいと考えています。
最後に、Viewbox またはそれに類似したものが必要です。この Viewbox にはキャンバスが含まれている必要があり、このキャンバスには、塗りつぶされた四角形、楕円形など (ペイントなどの描画アプリケーションなど) のようなさまざまなものが存在する可能性があります。
ここで、Canvas のコンテンツを PNG に保存する機能を実装したいと考えています。Canvas を RenderTargetBitmap にレンダリングしてから保存しようとしました。
ここでの問題は、特定の座標を設定できないことです。設定できるのは RenderTargetBitmap のサイズ (キャンバスの幅と高さ) だけですが、(0|0) から始まるサイズのレンダリングを開始します。要素は別の場所から始まります。そのための回避策はありますか??
次の問題は、root-Canvas のサブ要素として画像を追加する可能性があるはずですが、品質と Viewbox 内のすべてが印刷されることをどのように気にすることができますか?
どうもありがとうございました!
- - - 編集 - - -
私は解決策を持っていると思います:
void SaveUsingEncoder(Canvas myCanvas, string fileName)
{
PngBitmapEncoder encoder = new PngBitmapEncoder();
RenderTargetBitmap bitmap = new RenderTargetBitmap(
(int)myCanvas.ActualWidth,
(int)myCanvas.ActualHeight,
96,
96,
PixelFormats.Pbgra32);
Rect bounds = VisualTreeHelper.GetDescendantBounds(myCanvas);
Console.WriteLine(bounds.X + "|" + bounds.Y + " " + bounds.Width + "|" + bounds.Height);
DrawingVisual dv = new DrawingVisual();
using (DrawingContext ctx = dv.RenderOpen())
{
VisualBrush vb = new VisualBrush(myCanvas);
ctx.DrawRectangle(vb, null, new Rect(bounds.Location, bounds.Size));
}
bitmap.Render(dv);
BitmapFrame frame = BitmapFrame.Create(bitmap);
encoder.Frames.Add(frame);
using (var stream = File.Create(fileName))
{
encoder.Save(stream);
}
}
これにより、完全なキャンバスが保存されます