使用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;
每次都会创建一个新的位图,这会产生内存/性能损失。由于我的图像大小没有变化,有没有更有效的方法来做到这一点?
答案 0 :(得分:3)
您使用的是错误的构造函数。只需直接从非托管数据创建一个位图,它就会包装数据,而不是创建一个新的位图,只是立即抛弃它:
new Bitmap(_size.Width, _size.Height, 4 * _size.Width, PixelFormat.Format32bppArgb,
unmanagedByteDataPtr);