我目前在用我生成的色彩映射表对QImage进行假着色时遇到了一些问题。我已经将代码简化为一些基本步骤(通常分布在多个类中)。
我可以用下面的代码重现这个问题:
//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看起来不错(原始结果的副本),但最终结果是错误的。谁能告诉我哪里出了问题?
原图:

fc.jpg的输出

发布于 2020-03-30 01:03:59
变化
QImage tmp = pixmap.toImage();至
QImage tmp = pixmap.toImage().convertToFormat(QImage::Format_Grayscale8);QPixmap将图像存储为RGB,因此当您从QPixmap转换为QImage时,格式将为32 bpp (Format_RGB32)。转换回Format_Grayscale8,将为您提供预期的8bpp灰度格式。
https://stackoverflow.com/questions/60911782
复制相似问题