3

C# の一部のピクセル ベースの操作に関して問題があります。Bitmapのイメージ シェルとして機能するクラスを作成しました。BitmapDataLockBitsを使用して画像配列に直接アクセスし、そこからバイトを読み取ることにより、画像内の特定の (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 によって保存された画像でしか見つかりませんでした。余分なバイトの目的とその余分なバイトを検出する方法を誰かに説明してもらいたいと思っていました。

4

1 に答える 1

3

MSDNから:

The stride is the width of a single row of pixels (a scan line), rounded up to a four-byte boundary. If the stride is positive, the bitmap is top-down. If the stride is negative, the bitmap is bottom-up.

したがって、ストライドは常に 4 の倍数であり、3x5 の場合は 16 に切り上げられます。

于 2013-03-08T18:16:20.313 に答える