QImage ложная раскраска с форматом Indexed8 - PullRequest
1 голос
/ 29 марта 2020

У меня в настоящий момент проблемы с ложной раскраской QImage с созданной мной картой цветов. Я сократил код до нескольких базовых c шагов (обычно распределенных по нескольким классам).

Я могу воспроизвести проблему с помощью этого кода:

    //fill color table
    QVector< QRgb > colors;
    for (unsigned int i = 0; i < 256; ++i) {
        double fac = (double(i) / 255.) * 0.8;
        QColor color = QColor::fromHslF(fac, 0.95, 0.5);
        colors.push_front(color.rgba());
    }

    //load original
    QImage origImg;
    origImg.load("lena.jpg");
    QImage::Format f = origImg.format(); //outputs Format_Grayscale8 (24)
    origImg.save("out1.jpg");

    //convert to pixmap
    QPixmap pixmap;
    pixmap.convertFromImage(origImg);

    //convert back to Image
    QImage tmp = pixmap.toImage();
    tmp.save("out2.jpg");

    //make false color version
    QImage fc = QImage(tmp.bits(), tmp.width(), tmp.height(), QImage::Format_Indexed8);
    fc.setColorTable(colors);

    //save false color version
    fc.save("fc.jpg");

Мои временные результаты out1. jpg и out2.jpg выглядят хорошо (копии оригинала), но окончательный результат не работает. Кто-нибудь может сказать мне, что идет не так?

оригинальное изображение:

original image

вывод для f c .jpg

output for fc.jpg

1 Ответ

3 голосов
/ 29 марта 2020

Изменить

QImage tmp = pixmap.toImage();

на

QImage tmp = pixmap.toImage().convertToFormat(QImage::Format_Grayscale8);

QPixmap сохраняет изображение в формате RGB, поэтому при преобразовании из QPixmap в QImage формат будет 32 bpp (Format_RGB32) , Преобразование обратно в Format_Grayscale8 даст ожидаемый формат в оттенках серого в 8 бит / с.

...