|
System.Drawingの範囲だと、BitmapDataを使って一行ずつコピーすることになりますね。 手順としては、 1. クリップ後の8bppビットマップを格納できるオブジェクトをNew Bitmap(width, height, PixelFormat)で作成する 2. クリップ元、クリップ先のBitmapそれぞれでLockBitsを呼び出してBitmapDataオブジェクトを取得する 3. クリップ元のBitmapData::Scan0から、クリップ先のBitmapData::Scan0に必要な分をコピー 4. Bitmap::UnlockBitsでそれぞれBitmapDataを解放
コピーについてですが。 BitmapData::Scan0はIntPtr型なので、Marshal.Copyメソッドを使って、Byte配列を介してコピーするのがいいでしょう。 クリップ元のsrcX,srcYからclipWidth,clipHeightをクリップ先にコピーするとして、 0 から clipHeight - 1 までの y それぞれについて、 クリップ元先頭アドレス:BitmapData::Scan0 + (y + srcY) * BitmapData::Stride + srcX クリップ先先頭アドレス:BitmapData::Scan0 + y * BitmapData::Stride を、clipWidthのサイズのByte配列を使って、For文などで順次Marshal.Copy(1行につき、クリップ元からByte配列へ、Byte配列からクリップ先へと2回)していきます。
|