Qt QImage to QPixmap Conversion loses Color Information for UI

12,200

From the question, I understand that the rectangles and text are part of the source image ?

I am guessing that the problem may be related to different formats for the color... which ConvertToFormat is not able to solve.

Perhaps try to make sure that in the source image the rectangles and text are saved with the same RGB32 format as the rest of the image ?

Share:
12,200
PhilBot
Author by

PhilBot

The ship stays where it is and the engines move the universe around it.

Updated on June 05, 2022

Comments

  • PhilBot
    PhilBot almost 2 years

    I am trying to update a QPixmap on a QLabel in my main Qt UI. The following slot is called to do this with the "newImage" variable QImage ( because it's from a different thread ). The QImage is converted to someImage with convertFromImage ( I've also tried ::fromImage ). If I just save the QImage "newImage" to file, I get a green rectangle and red text that I draw with OpenCV earlier on, however, if I save the converted pixmap OR show the converted pixmap I lose the color for the rectangle and text in the image but keep the color for the frame itself. I've posted 2 images below to demonstrate the difference between the QImage I pass this slot and the pixmap that is displayed on the UI in the pixmap. I don't know how to have the pixmap display the rectangle and text with color! What am I doing wrong? Thanks!

    enter image description here enter image description here

    void MainWindow::updateImage(QImage newImage, double timeElapsed) {
    
        QImage someImage = newImage.convertToFormat(QImage::Format_RGB888);
    
        // Get pixmap from data
        m_NewPixMap.convertFromImage(someImage,Qt::ColorOnly); // Tried various ones of these
    
        // Debug status
    //    qDebug() << "Pixmap received by MainWindow and elapsed time is: " << timeElapsed << " ( Image size is: " << newImage.byteCount() << " )";
    //    qDebug() << "Pixmap is null? " << m_NewPixMap.isNull();
    
        // Update the label
        float hz = 1000.0f / timeElapsed;
        QString status;
        status.sprintf("FrameRate (Hz) = %.02f (%.0f ms)", hz, timeElapsed);
    
        // Update status label
        m_StatusLabel->setText(status);
    
        // Update the main view
        m_Label->setPixmap(m_NewPixMap);
        repaint();
    
        //qDebug() << "Saving QImage now...";
        QFile file(QString("output_detected_images/detected_image_%1.png").arg(m_Counter));
        file.open(QIODevice::WriteOnly);
        bool savedSuccessfully = newImage.save(&file,"PNG"); // This gives proper color in image
        //bool savedSuccessfully =  m_NewPixMap.save(&file, "PNG"); // THIS GIVES A BLACK IMAGE
        qDebug() << "Done saving QPixmap... " << savedSuccessfully;
    
    }