4

ですから、実行したばかりの簡単なテストについては非常に混乱しています。私はC#でいくつかの画像処理を行っています。Get / SetPixel()は遅すぎることがわかっているので、私はLockBitsを使用して生データを取得しています。

しかし、私には理解できない状況に陥ったようです。画像をスキャンしていると、各ピクセルがBgra、つまり青バイト、緑バイト、赤バイト、アルファの順に配置されているように見えます。私はそれらがArgbの順序で配置されるだろうという印象を受けました。これが私が使用しているコードのサンプルです。

BitmapData baseData =
    m_baseImage.LockBits(new Rectangle(new Point(0, 0), m_baseImage.Size), 
        ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
Bitmap test = new Bitmap(m_baseImage.Width, m_baseImage.Height);           

byte* ptr = (byte*)baseData.Scan0;
for (int y = 0; y < m_baseImage.Height; ++y)
{                              
    for (int x = 0; x < m_baseImage.Width; ++x)
    {
        // this works, image is copied correctly
        Color c1 = Color.FromArgb(*(ptr + 3), *(ptr + 2), *(ptr + 1), *ptr);
        // below does not work!  Bytes are reversed.
        //Color c1 = Color.FromArgb(*ptr, *(ptr + 1), *(ptr + 2), *(ptr + 3));

        test.SetPixel(x, y, c1);
        ptr += 4;
    }             
}

m_baseImage.UnlockBits(baseData);
pictureBox1.Image = m_baseImage;
pictureBox2.Image = test;

ベースイメージの色を取得する最初の行は機能しますが、2番目の行は機能しません。私はここで非常に明白な何かを見逃していると確信しています。

4

2 に答える 2

6

ARGBは、ワードとしてフェッチされたワードのバイト順序を指します。バイトを一度に1つずつフェッチすると、IBM PCはリトルエンディアンであるため、emlowからhiを受け取ります。

于 2009-02-24T06:40:55.927 に答える
6

BGRAの色が反転するだけでなく、行も反転します。画像の下部がメモリ内で最初に表示されます。これは、Windowsが常に機能してきた方法です。

リトルエンディアンの説明は明白に思えますが、それは真実ではないと思います。Windows APIでCOLORREFの定義を見ると、赤が下位バイトで、青が上位バイトであることがわかります。これを単一の整数値として格納した場合、RGB0になります。

于 2009-02-24T07:23:50.003 に答える