背景

2017-02-18 17 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形式(アルファ付き)にする必要があります。アルファチャンネルを維持しながら、画像ピクセルを反復してグレー値を計算することで、カラー画像をグレーに変換できます。たとえば、次のようになります。

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