2017-02-18 3 views
0

Я хочу, чтобы преобразовать значок в оттенках серого формат (чтобы дать обратную связь отключить действия для пользователя), как это:Преобразование QImage (иконка) в формате GRAYSCALE, сохраняя при этом фон

enter image description here

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); 
    } 

Но результат плохой и фон также преобразуется в серый цвет:

enter image description here

Так что я могу сделать?

ответ

1

Для обеспечения прозрачности фона вам необходимо иметь изображение в формате 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); 
Смежные вопросы