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
場合によっては、ビットマップの大部分がランダムなピクセルに置き換えられたり、完全にランダムに表示しようとするとプログラム全体がクラッシュしたりすることがあります。