所以,我是一个简短的测试,我只是跑很困惑。我在C#中做一些图像处理。获取/ 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;

,其抓住基本图像作品的颜色的第一行,第二不。我敢肯定,我失去了一些东西很明显这里。

有帮助吗?

解决方案

不仅是颜色反转BGRA,但是行被反转,以及 - 图像的底部是在存储器中的第一个。这只是了Windows一贯努力。

在little-endian的解释似乎很明显,但我不认为这是事实。如果你看一下在Windows API中的COLORREF的定义,你会发现,红色是低位字节和蓝色是高阶;如果存储在此作为一个整数值,这将是RGB0。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top