HDDに数種類の(〜2GB)生24bpp RGBファイルがあります。 ここでは、その一部を取り出して、希望するサイズに拡大縮小したいと考えています。
(許容される尺度は1、1/2、1/4、1/8、...、1/256)C#System.Drawing.Bitmapから効率的にピクセルデータを取得する
私は現在、関心のある矩形からすべての行を配列に読み込んでいます、それは正しい高さを持っているが、間違った幅を持つビットマップを私に残す。
次のステップとして、新しく作成された配列からビットマップを作成します。
これはポインタを使って行われ、データのコピーは含まれません。
次に、正しいサイズの新しいビットマップを作成するビットマップでGetThumbnailImageを呼び出します。
今、新しく作成したビットマップの生のピクセルデータ(バイト配列として)を返したいとします。 しかし、私は現在、LockBitsを使って新しい配列にデータをコピーしています。
私の質問は:ピクセルデータをビットマップからバイト配列にコピーすることなく取得する方法はありますか?以下のような
何か:
var bitmapData = scaledBitmap.LockBits(...)
byte[] rawBitmapData = (byte[])bitmapData.Scan0.ToPointer()
scaledBitmap.UnlockBits(bitmapData)
return rawBitmapData
私はこれが動作しないことを十分承知しているが、それは私が基本的に達成したいものに単なる一例です。
を動作させるには、unsafe {} void *からbyte []の代わりに、 IntPtr ptr = bitmapData.Scan0;を試してください。 int bytes = Math.Abs(bitmapData.Stride)* bitmapData.Height; 生=新しいバイト[バイト]; Marshal.Copy(ptr、raw、0、bytes); 生の返品。 // byte [] – antonio