如何将 PixelFormats.IndexedX 与 RenderTargetBitmap 一起使用?

发布于 2024-10-05 08:41:34 字数 751 浏览 2 评论 0原文

我希望使用 RenderTargetBitmapDrawingVisual (示例中的视觉对象)渲染为位图,并使用视图将此位图设置为 Canvas 的背景 code> 如下:

var bmp = new RenderTargetBitmap(2000, 50, 120, 96, PixelFormats.Indexed2);
bmp.Render(visual);
var brush = new ImageBrush(bmp) { Stretch = Stretch.Fill };
Canvas.Background = brush;

当使用 PixelFormats.Default 作为 RenderTargetBitmap 的最后一个参数时,图像将按预期渲染。但是,当我选择 PixelFormats.Indexed2 (或任何 PixelFormats.IndexedX)时,我的代码似乎毫无异常地退出该方法,bmp.Render 行永远不会被调用,因此图像不会显示在 Canvas 上。

如何将 IndexedX 像素格式与 RenderTargetBitmap 结合使用?或者有其他方法可以减少图像的内存占用吗?它只使用三种颜色,因此使用调色板而不是 32 位 RGB 似乎是最佳选择。

I am looking to render a DrawingVisual (visual in the example) to a bitmap using RenderTargetBitmap with the view to set this bitmap as the background to a Canvas as below:

var bmp = new RenderTargetBitmap(2000, 50, 120, 96, PixelFormats.Indexed2);
bmp.Render(visual);
var brush = new ImageBrush(bmp) { Stretch = Stretch.Fill };
Canvas.Background = brush;

When using PixelFormats.Default as the last argument to RenderTargetBitmap, the image renders as expected. However, when I choose PixelFormats.Indexed2 (or any of the PixelFormats.IndexedX), my code seems to exit the method without an exception, the bmp.Render line is never called and hence the image is not displayed on the Canvas.

How to use the IndexedX pixel formats with RenderTargetBitmap? Or are there other ways to reduce the memory footprint of the image? It only uses three colors, so using a palette rather than 32bit RGB seemed the way to go.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

眉黛浅 2024-10-12 08:41:34

你不能。 RenderTargetBitmap 仅支持 Pbgra32 像素格式。这是因为 WPF 的渲染系统完全以每像素 32 位工作。这是它生成图像的格式,也是它在您想要渲染图像时首选的图像格式。 (如果您为其提供任何其他格式的位图,则需要首先将其转换为每像素 32 位表示形式。)

您打算如何处理此位图?如果您想在 WPF 应用程序中呈现它,无论如何都需要先将其转换为 32bpp 格式,因此如果您尝试在任何其他应用程序内部保存它,您将面临使用更多内存的风险格式。 (您将拥有所谓的内存高效表示 WPF 实际能够使用的版本。)更不用说在您选择的格式和 WPF 可以使用的格式之间进行转换所花费的额外 CPU 时间。

You can't. RenderTargetBitmap only supports the Pbgra32 pixel format. That's because WPF's rendering system works entirely in 32 bits per pixel. That's the format in which it generates images, and it's also the format in which it prefers images to be in if you want to render them. (If you provide it with a bitmap in any other format, it'll need to convert it into a 32 bit per pixel representation first.)

What are you planning to do with this bitmap? If you want to render it in a WPF application, it'll need to be converted to a 32bpp format first in any case, so you risk using more memory if you attempt to hold it internally in any other format. (You'll have your supposedly memory-efficient representation and the version WPF's actually able to work with.) Not to mention the extra CPU time spent converting between your chosen format and a format WPF can work with.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文