C#使用新数据有效地重绘图像

时间:2016-04-18 14:59:33

标签: c# performance memory-management bitmap

使用C#中的新数据重绘图像的内存效率最高的方法是什么?

我正在使用的外部DLL分配一个字节缓冲区来保存我的(width * hight * bytesPerPixel)像素数据,其中每个像素都是ARGB32格式。 DLL通过与硬件交互自动更新具有新数据的缓冲区,然后调用C#回调说新数据已准备就绪。现在,我显示新数据的方案是

var bmp = new Bitmap(_size.Width, _size.Height, PixelFormat.Format32bppArgb);
var bitmapData = bmp.LockBits(
                new Rectangle(new Point(0, 0), _size), 
                ImageLockMode.UserInputBuffer | ImageLockMode.WriteOnly,
                PixelFormat.Format32bppArgb, 
                unmanagedByteDataPtr);
bmp.UnlockBits(bitmapData);
myGui.ImageCtrl.Image = bmp;

每次都会创建一个新的位图,这会产生内存/性能损失。由于我的图像大小没有变化,有没有更有效的方法来做到这一点?

1 个答案:

答案 0 :(得分:3)

您使用的是错误的构造函数。只需直接从非托管数据创建一个位图,它就会包装数据,而不是创建一个新的位图,只是立即抛弃它:

new Bitmap(_size.Width, _size.Height, 4 * _size.Width, PixelFormat.Format32bppArgb,
           unmanagedByteDataPtr);