C# の一部のピクセル ベースの操作に関して問題があります。Bitmapのイメージ シェルとして機能するクラスを作成しました。BitmapDataとLockBitsを使用して画像配列に直接アクセスし、そこからバイトを読み取ることにより、画像内の特定の (x,y) 位置にあるピクセルの RGB 値をBitmap.GetRGB(x,y)
カラー オブジェクトよりもはるかに高速に取得できます。(x,y) ピクセルのマスクで RGB を取得するために、この関数を追加しました。0x00RRGGBB
public unsafe int getPixel(int x, int y)
{
byte* imgPointer = (byte*)bmpData.Scan0;
int pixelPos = 0;
if (y > 0) pixelPos += (y * bmpData.Stride);
pixelPos += x * (hasAlpha ? 4 : 3);
int blue = *(imgPointer + pixelPos);
int green = *(imgPointer + pixelPos + 1);
int red = *(imgPointer + pixelPos + 2);
int rgb = red << 16;
rgb += green << 8;
rgb += blue;
return rgb;
}
これは、MSPaint を使用して生成した画像を除いて、これまでに使用したすべての画像で問題なく機能します。たとえば、黄色の 5 つの色合いを含むペイントで 5x1 の画像を作成しました。ただし、この画像をプログラムにロードすると、画像のストライドは 16 になります。15 (ピクセルあたり 3 バイト、5 ピクセル) であると思われましたが、何らかの理由で最初の 3 バイト (最初のピクセル) の後に余分なバイトがあり、残りのピクセルが配列に続きます。
これは、MSpaint によって保存された画像でしか見つかりませんでした。余分なバイトの目的とその余分なバイトを検出する方法を誰かに説明してもらいたいと思っていました。