c# - 使用RenderTargetBitmap保存部分显示图像

标签 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而改变。它还会使应用程序变慢。我确实尝试对整个 Canvas 进行 RenderTargetBitmap,但这比这样做慢得多。

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

最佳答案

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

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

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

关于c# - 使用RenderTargetBitmap保存部分显示图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6750581/

相关文章:

WPF:将 DataGrid 放入 ComboBox

c# - WPF API 能否在 WCF 服务中安全使用?

c# - 如何制作可滚动的文本框列表?

c# - 使用 Linq 从包含列表的列表生成列表

c# - 如何在C#中计算每月的第二个星期五

wpf - 如何停止ViewModel代码在设计器中运行?

wpf - 代码和 XAMLin WPF 之间的界线在哪里?

c# - 静态和动态 C# 之间的互操作性差

c# - 构建已退出,代码为 1

c# - 如何将导出的 View 放置到另一个导出的 View 的特定位置?