2011-09-10 17 views
12

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 

私はこれが動作しないことを十分承知しているが、それは私が基本的に達成したいものに単なる一例です。

+0

を動作させるには、unsafe {} void *からbyte []の代わりに、 IntPtr ptr = bitmapData.Scan0;を試してください。 int bytes = Math.Abs​​(bitmapData.Stride)* bitmapData.Height; 生=新しいバイト[バイト]; Marshal.Copy(ptr、raw、0、bytes); 生の返品。 // byte [] – antonio

答えて

15

これはあなたの最善の策だと思います。

var bitmapData = scaledBitmap.LockBits(...); 
var length = bitmapData.Stride * bitmapData.Height; 

byte[] bytes = new byte[length]; 

// Copy bitmap to byte[] 
Marshal.Copy(bitmapData.Scan0, bytes, 0, length); 
scaledBitmap.UnlockBits(bitmapData); 

バイト[]を囲む必要がある場合は、コピーする必要があります。

割り当てられたバイトを削除する必要はなく、IDisposableを実装した時点で元のBitmapオブジェクトを破棄するだけで済みます。

+0

私が望んでいた答えは正確ではありませんが、Marshal.Copyを使用すると、整数ごとに整数をコピーするよりも見栄えがよくなります。ありがとう – Arokh

関連する問題