Frage

Ich bin den Aufbau einer QT-GUI-Anwendung und verwenden QImage zum Öffnen Bilder. Mein Problem ist, dass ich nicht herausfinden kann, wie QImage des Bit () und Scanline () zu verwenden, Methoden Zugang zu bekommen pro Pixel-Ebene.

Ich habe diesen Beitrag gesehen Qt QImage Pixelmanipulation Probleme aber dies ist nur für das erste Pixel jeder Zeile. Ist das richtig oder ich habe alles falsch?

Vielen Dank im Voraus

War es hilfreich?

Lösung

scanlines entsprechen dem die Höhe des Bildes, die Spalten entsprechen der Breite des Bildes.

Nach der Dokumentation, der Prototyp sieht aus wie uchar* QImage::scanline(int i) oder eine ähnliche const Version.

Aber, wie ein Kommentator wies darauf hin, weil die Daten über die Maschinenarchitektur und Bild abhängig ist, sollten Sie nicht verwenden, um die uchar * direkt. Verwenden Sie stattdessen etwas wie folgt aus:

QRgb *rowData = (QRgb*)img.scanLine(row);
QRgb pixelData = rowData[col];
int red = qRed(pixelData);

Andere Tipps

Es kann nicht ohne weiteres ersichtlich sein, von Kaleb der Post, aber die folgenden Arbeiten für ein Pixel auf einer Format_RGB32 Bildeinstellung.

// Get the line we want
QRgb *line = (QRgb *)image->scanLine(row_index);

// Go to the pixel we want
line += col_index;

// Actually set the pixel
*line = qRgb(qRed(color), qGreen(color), qBlue(color));

Die Antwort nicht für mich arbeiten. Es sieht aus wie werden die Daten nicht 32bit auf meinem System ausgerichtet ist. Um die richtigen Daten, auf meinem System zu bekommen ich hatte, dies zu tun:

for(uint32_t Y = 0; Y < mHeight; ++Y)
{
    uint8_t* pPixel = Image.scanLine(Y);

    for(uint32_t X = 0; X < mWidth; ++X)
    {
      const int Blue = *pPixel++;
      const int Green = *pPixel++;
      const int Red = *pPixel++;

      uint8_t GrayscalePixel = (0.21f * Red) + (0.72f * Green) + (0.07 * Blue);
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top