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

时间:2011-07-19 16:24:38

标签: c# wpf

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

要做到这一点,我有Canvas一个Image,然后我以编程方式添加小图片。

现在我正在尝试将合成图像的某些部分保存为png个文件。我以为我会使用RenderTargetBitmap来渲染我想要的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);
  }
}

显而易见的问题是显示会因RenderTransform而改变。它还使应用程序变慢。我确实试图对整个画布进行RenderTargetBitmap,但这比这样做慢得多。

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

1 个答案:

答案 0 :(得分:3)

您要使用的是CroppedBitmap,可以保存图像的裁剪部分。

// (BitmapSource bmps)
CroppedBitmap crop = new CroppedBitmap(bmps, new Int32Rect(selRect.X, selRect.Y, selRect.Width, selRect.Height));

编辑:由于似乎无法在WPF中执行此操作,我建议使用GDI +预渲染大图像(不显示)并加载区域它想要放在较小的画布上。