gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:13:40 25 4
gpt4 key购买 nike

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

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

现在我正在尝试将合成图像的一部分保存为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com