Frage

Also, ich bin sehr verwirrt über einen schnellen Test, den ich gerade lief. Ich tue etwas Bildverarbeitung in C #. Get / SetPixel () haben sich als zu langsam sein, so dass ich bin mit LockBits an den Rohdaten zu erhalten.

Allerdings scheinen ich eine Situation getroffen zu haben, die ich nicht herausfinden kann. Während Sie das Bild scannen, so scheint es, dass jedes Pixel als BGRA angelegt wird, die, blau-Byte, grün Byte, rot-Byte ist, und alpha, in dieser Reihenfolge. Ich hatte den Eindruck, dass sie in aRGB Reihenfolge angelegt werden würde. hier ist ein Beispiel für den Code, ich verwende.

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;

Die erste Zeile, die die Farbe der Basisbildwerke greift, tut die zweite nicht. Ich bin mir ziemlich sicher, dass ich etwas sehr offensichtlich bin hier fehlt.

War es hilfreich?

Lösung

sind nicht nur die Farben BGRA umgekehrt, aber die Zeilen als auch umgekehrt - der untere Rand des Bildes ist die erste im Speicher. Es ist nur die Art und Weise von Windows immer gearbeitet hat.

Die Little-Endian-Erklärung scheint offensichtlich, aber ich glaube nicht, es ist die Wahrheit. Wenn man sich die Definition von COLORREF in dem Windows-API , werden Sie feststellen, dass Red das niederwertige Byte und Blau ist die höhere Ordnung; wenn Sie dies als ein einziger Integer-Wert gespeichert, wäre es RGB0 sein.

Andere Tipps

ARGB bezieht sich auf die Byte-Reihenfolge in Worte als Worte geholt. Wenn Sie das Bytes einen nach dem anderen holen, werden Sie em erhalten niedrig hallo wie IBM PC sind little-endian

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top