Pregunta

Por lo tanto, estoy muy confundido durante una prueba rápida que acaba de ejecutar. Estoy haciendo un poco de procesamiento de imágenes en C #. Obtener / SetPixel () han demostrado ser demasiado lento, por lo que estoy usando LockBits para llegar a los datos en bruto.

Sin embargo, me parece que han golpeado una situación que no puedo entender. Durante la exploración de la imagen, parece que cada píxel se presenta como BGRA, es decir, el byte azul, verde byte, el byte de color rojo, y alfa, en ese orden. Yo tenía la impresión de que serían despedidos a cabo con el fin argb. aquí es un ejemplo del código que estoy usando.

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;

La primera línea que agarra el color de las obras imagen de base, el segundo no lo hace. Estoy bastante seguro de que me estoy perdiendo algo muy obvio aquí.

¿Fue útil?

Solución

No sólo son los colores invertidos BGRA, pero las filas están invertidos, así - el fondo de la imagen es la primera en la memoria. Es sólo la forma en que Windows siempre ha funcionado.

La explicación ascendente hacia la izquierda parece obvio, pero no creo que es la verdad. Si nos fijamos en la definición de COLORREF en la API de Windows , se dará cuenta que el rojo es el byte de orden inferior y el azul es el orden superior; si almacenó esto como un único valor entero, sería RGB0.

Otros consejos

ARGB se refiere a la orden de bytes en palabras descabellada como palabras. Si está obteniendo los bytes uno a la vez, recibirá em baja a alta como IBM PC es ascendente hacia la izquierda

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top