私はさまざまなサイズの UI 要素 (WPF) のスクリーンショットを撮ることに取り組んでおり、「RenderTargetBitmap を使用してこれを達成することができます。しかし、コピーを取得している間UIElement
、一部を持っているものAdorner
は来ません。これを達成するにはどうすればよいですか。任意の参照またはコードスニペット?
3 に答える
ネイティブの WPF 印刷名前空間を使用して XPS ファイルに出力すると、結果にアドナーが含まれます (テストに成功しました)...
using System.Windows.Controls;
private void ExecutePrintCommand(object obj)
{
PrintDialog printDialog = new PrintDialog();
if (printDialog.ShowDialog() == true)
{
printDialog.PrintVisual(_mainWindow, "Main Window with Adorner");
}
}
PrintDialog を使用したくない場合 (実際にダイアログ ボックスが開きます)。XpsDocumentWriter クラスを使用して、プログラムでプロセスを制御できます。これを有効にするスニペットは...
XpsDocumentWriter xpsdw = PrintQueue.CreateXpsDocumentWriter(q);
xpsdw.Write(viewer.Document);
...ここから抽出されました: Print FixedDocument programmatically そして、それが要件の一部である場合、プロセスの微調整に関する記事が他にもあります。XPS ファイルは、実際には「xps」ファイルを装った「zip」ファイルであるため、拡張子を変更して解凍し、内容が有用かどうかを確認してください。
第二に、このコードを使用して、TextBox の装飾を使用してウィンドウを保存することをテストしました...
private void SaveWithAdorner()
{
RenderTargetBitmap rtb = RenderVisaulToBitmap(_mainWindow, 500, 300);
MemoryStream file = new MemoryStream();
BitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(rtb));
encoder.Save(file);
using (FileStream fstream = File.OpenWrite("Myimage.jpg"))
{
file.WriteTo(fstream);
fstream.Flush();
fstream.Close();
}
}
...良い結果が得られました。つまり、装飾は保存されたビットマップに赤い境界線で表示されます。私は Png エンコーダーを使用しているため、これはコードとは異なる場合があります (ただし、「jpg」ファイルに保存されます)。
両方のアプローチを正常にテストしましたが、ハードウェアで確認する必要があります。
そして最後に、最後の手段として、WPF のハードウェア レンダリング モードを無効にして、ソフトウェア レンダリングに設定することができます...
RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;
...ここに素敵なSOスレッドがあります: ソフトウェアレンダリングモード-WPF
私の場合、次のようにAdornerLayerクラスを呼び出すだけで済みました。
public void GetScreenshotWithAdorner(Canvas canvas, string filename)
{
AdornerLayer adornerlayer = AdornerLayer.GetAdornerLayer(canvas);
RenderTargetBitmap rtb = new RenderTargetBitmap(
(int)canvas.ActualWidth,
(int)canvas.ActualHeight,
96, //dip X
96, //dpi Y
PixelFormats.Pbgra32);
rtb.Render(canvas); //renders the canvas screen first...
rtb.Render(adornerlayer); //... then it renders the adorner layer
SaveRTBAsPNG(rtb, filename);
}
private void SaveRTBAsPNG(RenderTargetBitmap bmp, string filename)
{
PngBitmapEncoder pngImage = new PngBitmapEncoder();
pngImage.Frames.Add(BitmapFrame.Create(bmp));
using (var filestream = System.IO.File.Create(filename))
{
pngImage.Save(filestream);
}
}
これは、キャンバスにすべての装飾を含めたい場合に機能します。