使用 RenderTargetBitmap 保存显示图像的一部分

Joe*_*eau 2 c# wpf

我有一个简单的 WPF 应用程序,我在其中显示一个非常大的图像 (9000x2875),并在其上显示许多小图像 (64x64)。

为此,我有一个Canvaswith one Image,然后我以编程方式在它们到达时添加小图像。

现在我试图将合成图像的一部分保存为png文件。我以为我会使用 aRenderTargetBitmap来渲染Canvas我想要的部分。我的问题是我找不到保存图像正确部分的好方法。这是我目前的黑客:

private static void SaveImage(Canvas canvas, string file, int x, int y, int width, int height)
{
  //changing 0,0 on the canvas so RenderTargetBitmap works as expected.
  canvas.RenderTransform = new MatrixTransform(1d, 0d, 0d, 1d, -x, -y);
  canvas.UpdateLayout();
  RenderTargetBitmap bmp = new RenderTargetBitmap(width, height, 96d, 96d, Pixelformats.Pbgra32);
  bmp.Render(canvas);
  PngBitmapEncoder encoder = new PngBitmapEncoder();
  encoder.Frames.Add(BitmapFrame.Create(bmp));
  using(Stream s = File.Create(file))
  {
    encoder.Save(s);
  }
}
Run Code Online (Sandbox Code Playgroud)

这样做的明显问题是显示会因RenderTransform. 它还使应用程序变慢。我确实尝试对整个画布执行 RenderTargetBitmap,但这比执行此操作要慢得多。

所以我的问题是:
有没有更简单的方法来保存查看图像的一部分?
如果没有,是否有人有更好的方法来解决这个问题?(我已经尝试过单个WriteableBitmap,但这与执行RenderTargetBitmap整个画布的速度一样慢。

Ed *_*tes 5

您要使用的是CroppedBitmap,它允许您保存图像的裁剪部分。

// (BitmapSource bmps)
CroppedBitmap crop = new CroppedBitmap(bmps, new Int32Rect(selRect.X, selRect.Y, selRect.Width, selRect.Height));
Run Code Online (Sandbox Code Playgroud)

编辑:由于似乎没有办法让它在 WPF 中按照你想要的方式执行,我建议使用 GDI+(不显示它)预先裁剪大图像并将它的区域加载到较小的画布上。