使用 GDI+ 显示像素数据

Posted

技术标签:

【中文标题】使用 GDI+ 显示像素数据【英文标题】:Displaying pixel data with GDI+ 【发布时间】:2012-04-24 18:12:34 【问题描述】:

我正在编写一个简单的 3D 渲染引擎。 我的 3D 处理的最终结果是像素数据。接下来我需要使用 GDI+ 在屏幕上显示它。 我正在使用 WinForms 和 Visual Basic。我直接在表单的 ClientRectangle 上绘图。

我有一些问题。 处理完一个像素后,我是否应该先将像素数据写入缓冲区,而不是将每个像素单独发送到 GDI+? - 如果是这样,我应该一次缓冲多少屏幕?全屏,半屏,四分之一,八分之一?我认为这里可能存在 RAM 使用/性能权衡。 - 像素缓冲区的最佳数据结构是什么? - 我使用哪个 GDI+ 命令来渲染像素缓冲区(或单个像素)?是否可以避免创建位图作为中间步骤并将像素数据直接发送到屏幕?

我预计的最大屏幕尺寸为 1600x1200。 RAM 可能低至 1GB。

谢谢。

【问题讨论】:

您应该先写入内存缓冲区——与渲染缓冲区相比,绘制单个像素的效率非常低。你应该有足够的空间;没有理由不缓冲整个图像。 好的,所以我有一个字节数组或一个 32 位整数数组或一个表示像素数据的结构数组,每个像素 4 个字节。将这些数据发送到屏幕的有效方法是什么? 正如@ananthonline 所说,您应该从 32 位/像素 RGBA 缓冲区开始。 Bitmap 类允许您基于各种数据缓冲区创建位图formats -- 您可能应该尝试PixelFormat32bppARGBPixelFormat32bppPARGB 我承认,我不知道 Visual Basic,也不知道如何从中访问所有 GDI+ 内容。因此,评论而不是答案...... 【参考方案1】:

希望你能在这里找到一些答案

    首先将数据写入 RGBA 结构的缓冲区。例如,如果您想渲染多个“层”然后再合成这些层,这将变得很容易。如果您想在某个时候执行任何延迟处理,它也将变得容易。完整(平铺?)渲染完成后,您可以将其刷新到输出位图/文件。 这取决于您允许用户呈现的分辨率。如果要渲染千兆像素图像,则需要以合理的大小平铺它。我建议磁贴大小是可配置的,然后您可以在测试后将其设置为合理的默认值。 如果您不希望执行任何延迟着色,我建议您从简单的 RGBA 缓冲区开始。 如果您不执行可以放入内存的平铺渲染/渲染图像,您可以简单地使用Bitmap.LockBits 并以这种方式写入数据。如果您使用平铺渲染,您将需要找到一个允许您一次渲染扫描线的库(并将其设为“平铺”)或修复您想要编写 TGA、PNG 和查找/写入的文件格式直接进入文件。将图像转储为 RAW 文件,然后使用命令行工具进行转换也是另一种选择。

希望这会有所帮助!

【讨论】:

以上是关于使用 GDI+ 显示像素数据的主要内容,如果未能解决你的问题,请参考以下文章

如何获得图片的宽高像素数??

在 GDI 中获取像素

GDI+下Bitmap逐像素快速读写性能测试

所有 Windows PC 显示器上的每英寸像素数是标准的吗? GetDeviceCaps WinAPI 调用中的 (LogPixelsX)

MFC GDI绘图基础

使用 c++ 和 GDI 分析屏幕截图以获得屏幕的平均颜色