Я хочу преобразовать значок в формат градаций серого (чтобы предоставить пользователю отзыв об отключении) следующим образом:
inline QPixmap grayScaleImage(const QIcon &icon) {
int w = icon.availableSizes().at(0).width();
int h = icon.availableSizes().at(0).height();
QImage image = icon.pixmap(w, h).toImage();
image = image.convertToFormat(QImage::Format_Grayscale8);
image.save("Sample.PNG");
return QPixmap::fromImage(image);
}
Но результат плохой, и фон также преобразуется в серый:
Так что я могу сделать ?
Чтобы фон оставался прозрачным, вам нужно иметь изображение в формате ARGB (с альфа-каналом). Вы можете преобразовать цветное изображение в серое, просматривая пиксели изображения, вычисляя значение серого, сохраняя альфа-канал. Например, вот так:
QImage im = some_pixmap.toImage().convertToFormat(QImage::Format_ARGB32);
for (int y = 0; y < im.height(); ++y) {
QRgb *scanLine = (QRgb*)im.scanLine(y);
for (int x = 0; x < im.width(); ++x) {
QRgb pixel = *scanLine;
uint ci = uint(qGray(pixel));
*scanLine = qRgba(ci, ci, ci, qAlpha(pixel)/3);
++scanLine;
}
}
return QPixmap::fromImage(im);
Других решений пока нет …