在winforms应用程序中,是否有任何方法可以直接绘制到窗口的像素缓冲区/字节数组?
我有一个字节数组,其中有一个ARGB位图的byte[] myimg = new byte[width x height x 4]
的图像,现在我想以窗体显示它,我所知道的唯一方法是首先制作一个位图,然后使用lockbits将像素写入位图,然后我将一个picturebox.image设置为我的位图示例。但是我想跳过这一步,直接写入窗体,如果可能的话,甚至不需要picturebox,这可能吗?
更新
澄清一下,我特别想避免窗口处理缩放/拉伸的开销和缓慢。我只想以最有效的方式将我自己的像素放到窗体的画布区域上,我自己的字节数组由我自己预先准备并相应地缩放。
更新2
正如jtxkopt所示,较低的windows api确实提供了使用bitblt
的方法,这几乎完全消除了我的开销
1条答案
按热度按时间qjp7pelc1#
你不能直接在
Form
上绘制原始图像数据。没有像DrawImageData(byte[] data, int width, int height, PixelFormat format);
那样的功能。我知道有两个选项。你可以尝试其中一个最适合你的需要。选项1
您可以使用构造函数从图像数据创建
Bitmap
类,根据需要填充数据并将位图绘制到屏幕上。但是,正如其他人所述,这样做并不会获得太多的性能提升,只要您停留在托管代码中。对于一个简单的实现,您可以查看示例代码。
选项2
这是一个使用
Win32
API的低级解决方案,但我认为这个解决方案比上一个解决方案更快,因为它处理WM_PAINT
消息本身,并使用bitblt
函数显示DIB
(设备独立位图)而不是绘制GdiplusBitmap
。不要解释如何创建一个DIB
,以及其他与Win32
相关的代码是如何工作的。下面是示例代码。比较它们并选择其中之一。