画像処理用のLockBitmapクラスを学習しようとしています。基本的にはx-y座標の色を返します。C#LockBitmap - xy座標からピクセルバイトへの変換
もちろん、この方法はsource.LockBits()
とMarshal.Copy()
/unsafe context
を実行した後にのみ機能します。
public Color GetPixel(int x, int y, Bitmap source)
{
int Depth = System.Drawing.Bitmap.GetPixelFormatSize(source.PixelFormat);
int Width = source.Width;
int Height = source.Height;
Color clr = Color.Empty;
// Get color components count
int cCount = Depth/8;
int PixelCounts = Width * Height;
byte[] Pixels = new byte[cCount * PixelCounts];
// Get start index of the specified pixel
int i = ((y * Width) + x) * cCount;
byte b = Pixels[i];
byte g = Pixels[i + 1];
byte r = Pixels[i + 2];
byte a = Pixels[i + 3]; // a
clr = Color.FromArgb(a, r, g, b);
return clr;
}
- それは常に
Depth/8
である理由、cCount
は何ですか? int i = ((y * Width) + x) * cCount
は、(x、y)座標をPixels[i]
に変換する固定式ですか?どうして?
これは非常に単純化されており、単純な32ビットビットマップでは本当に正しく動作します( 'Pixels'は最初の場所にデータを取得しないことは無視してください)。パレット、整列、ビット整列は処理しません(すべてのビットマップが「バイト整列」されているわけではありません)。安全なGDI +メソッドを回避したい場合は、高速なコードの鍵となる少しの研究を行う必要がありますあなたに関係しないエッジケースをしばしば無視していますが、それは最初のエッジケースが何であるかを知り、安全に無視できるかどうかを理解することを意味します。 – Luaan
@Luaan、応答に感謝します。私は本当にこれについてもっと研究したいと思っています。お勧めするチュートリアル/ウェブサイトはありますか?私はどんなキーワードをGoogleと知っていません。 –
事は、すべてこれが*古代*、低レベルのものです。ほとんどの場合、さまざまなソースからまとめなければならないという知識があります。ゲームでさえ、最近のすべてで32ビットARGBを使用しています(よく、HDR:Pに移行しているものは別です)。たとえば、特定のピクセル形式を想定することができれば、すべての複雑さを無視することができます。これは、最も一般的な形式(MSPaintの32ビットは最近のWindowsでは一般的です)を単純に選択する方法です。他の形式から変換するためにGDI +にフォールバックします。 – Luaan