我需要创建Bitmap
可以直接访问其像素数据的对象。
LockBits
对我的需要来说太慢了——它不适合快速重新创建(有时很大)位图。
所以我有一个自定义FastBitmap
对象。它有一个Bitmap
对象的引用和一个IntPtr
指向位图中位的对象。
构造函数如下所示:
public FastBitmap(int width, int height)
{
unsafe
{
int pixelSize = Image.GetPixelFormatSize(PixelFormat.Format32bppArgb) / 8;
_stride = width * pixelSize;
int byteCount = _stride * height;
_bits = Marshal.AllocHGlobal(byteCount);
// Fill image with red for testing
for (int i = 0; i < byteCount; i += 4)
{
byte* pixel = ((byte *)_bits) + i;
pixel[0] = 0;
pixel[1] = 0;
pixel[2] = 255;
pixel[3] = 255;
}
_bitmapObject = new Bitmap(width, height, _stride, PixelFormat.Format32bppArgb, _bits); // All bits in this bitmap are now directly modifiable without LockBits.
}
}
分配的内存在由解构器调用的清理函数中释放。
这有效,但不会持续很长时间。不知何故,如果不对位进行任何进一步的修改,分配的内存就会损坏,从而损坏位图。有时,位图的大部分被随机像素替换,有时当我尝试显示它时整个程序崩溃Graphics.DrawImage
- 一个或另一个,完全随机。