2010-01-19 18 views
11

Ich baue eine QT-GUI-Anwendung und verwende QImage zum Öffnen von Bildern. Mein Problem ist, dass ich nicht herausfinden kann, wie man QImages bit() und scanline() Methoden verwendet, um Zugriff auf Pixelebene zu erhalten.QT QBeispielpixelmanipulation

Ich habe diesen Beitrag Qt QImage pixel manipulation problems gesehen, aber dies ist nur für den ersten Pixel jeder Zeile. Ist das korrekt oder habe ich alles falsch verstanden?

Dank im Voraus

+0

oopps !! Es tut uns leid! nach der Frage der Veröffentlichung fand ich es in QT-Foren http://qt.nokia.com/doc/qq/qq17-imageio.html und die Antwort lautet: für (quint32 y = 0; y theosem

Antwort

13

Die scanlines zur der Höhe des Bildes entspricht, entsprechen die Spalten die Breite des Bildes.

Gemäß den Dokumenten sieht der Prototyp wie uchar* QImage::scanline(int i) oder eine ähnliche const Version aus.

Aber, wie ein Kommentator darauf hingewiesen, da die Daten abhängig von der Maschinenarchitektur und Bild ist, sollten Sie NICHT verwenden Sie die uchar * direkt. Verwenden Sie stattdessen etwas wie folgt aus:

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

-1: Achtung! Da diese Antwort bereits vor der offiziellen Qt-API-Doku in der Google-Suche erscheint, dachte ich, dass ein Wort der Warnung angebracht ist. Sie können NICHT [row] [col] verwenden, um auf Pixeldaten zuzugreifen, da [col] einen uchar auswählt und die Pixeldaten sehr vom Bit-pro-Pixel-Format abhängen. Bitte beachten Sie die Warnung in der offiziellen Dokumentation: "Sie können den Zeiger uchar * nicht direkt verwenden, da das Pixelformat von der Byte-Reihenfolge auf der zugrunde liegenden Plattform abhängt. Verwenden Sie qRed(), qGreen(), qBlue() und qAlpha() die Pixel. " http://qt-project.org/doc/qt-4.8/qimage.html#scanLine –

+1

Ich habe die Antwort aktualisiert, um den richtigen Weg zu zeigen, um darauf zuzugreifen. –

12

Es kann nicht sofort von Kaleb die Post offensichtlich, aber die folgenden Arbeiten für ein Pixel auf einem 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)); 
0

Die Antwort hat nicht für mich funktioniert. Es sieht so aus, dass die Daten nicht auf meinem System ausgerichtet sind. Um die richtigen Daten zu erhalten, musste ich auf meinem System folgendes 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); 
    } 
} 
Verwandte Themen