gpt4 book ai didi

c# - 为什么我的图像似乎是 Bgra 格式而不是 Argb 格式?

转载 作者:太空狗 更新时间:2023-10-30 00:13:17 26 4
gpt4 key购买 nike

所以,我对刚刚运行的快速测试感到非常困惑。我正在用 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;

获取基本图像颜色的第一行有效,第二行无效。我很确定我在这里遗漏了一些非常明显的东西。

最佳答案

BGRA 不仅颜色颠倒了,而且行也颠倒了——图像的底部是内存中的第一个。这就是 Windows 一直以来的工作方式。

little-endian 的解释似乎很明显,但我认为这不是事实。如果您查看 COLORREF in the Windows API 的定义,你会注意到红色是低位字节,蓝色是高位字节;如果将其存储为单个整数值,它将是 RGB0。

关于c# - 为什么我的图像似乎是 Bgra 格式而不是 Argb 格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/580666/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com