当前位置:  开发笔记 > 编程语言 > 正文

为什么我的图像看起来像Bgra而不是Argb?

如何解决《为什么我的图像看起来像Bgra而不是Argb?》经验,为你挑选了2个好方法。

所以,我对我刚刚跑过的快速测试非常困惑.我在C#中进行一些图像处理.Get/SetPixel()已被证明太慢,所以我使用LockBits来获取原始数据.

但是,我似乎遇到了一个我无法弄清楚的情况.在扫描图像时,似乎每个像素按照顺序布置为Bgra,即蓝色字节,绿色字节,红色字节和alpha.我的印象是他们将以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;

抓取基本图像颜色的第一行有效,第二行则没有.我很确定我错过了一些非常明显的东西.



1> Scott Evernd..:

ARGB指的是作为单词提取的单词中的字节顺序.如果你一次获取一个字节,那么你将收到低至高,因为IBM PC是小端的



2> Mark Ransom..:

不仅颜色反转BGRA,而且行也反转 - 图像的底部是内存中的第一个.这就是Windows一直以来的工作方式.

小端解释似乎很明显,但我认为这不是事实.如果你看一下Windows API中COLORREF的定义,你会发现Red是低位字节,Blue是高位字节; 如果将其存储为单个整数值,则为RGB0.

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有