2017-02-18 27 views
0

我想要的圖標轉換爲灰度格式(給禁用動作反饋到用戶)是這樣的:轉換QImage的(圖標)灰度格式,同時保持背景

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格式(帶有alpha)的圖像。通過迭代圖像像素,可以將彩色圖像轉換爲灰色,計算灰度值,同時保持Alpha通道。例如像這樣:

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