【问题标题】:Convert QImage(icon) to grayScale format while keeping background将 QImage(icon) 转换为灰度格式,同时保持背景
【发布时间】:2017-02-18 15:08:13
【问题描述】:

我想将图标转换为灰度格式(向用户提供禁用操作反馈),如下所示:

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

但结果很糟糕,背景也变成了灰色:

那我该怎么办?

【问题讨论】:

    标签: c++ qt grayscale qimage qicon


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-18
      • 2012-01-28
      • 1970-01-01
      • 2019-04-26
      • 2014-06-27
      • 2016-09-03
      • 2014-04-25
      • 2017-03-03
      相关资源
      最近更新 更多