c++ - 将 QImage(icon) 转换为 grayScale 格式,同时保留背景

标签 c++ qt grayscale qimage qicon

我想像这样将图标转换为灰度格式(向用户提供禁用操作反馈):

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

那我该怎么办呢?

最佳答案

为了保持背景透明,您需要使用 ARGB 格式(带 alpha)的图像。您可以通过遍历图像像素,计算灰度值,同时保持 alpha channel ,将彩色图像转换为灰色。例如像这样:

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

关于c++ - 将 QImage(icon) 转换为 grayScale 格式,同时保留背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42316844/

相关文章:

c++ - 将图标添加到工具栏中的 QAction

c++ - 尝试从源构建 Qt 会导致错误

c++ - C++中的灰度图像处理

c++ - 双自由或腐败(fasttop):

c++ - 如何提取字符串中的特定值

qt - 如何在QApplication执行之前获取QScreen

java - 如何将 3 个灰度图像组合成彩色?

algorithm - OpenCV cvtColor() 使用的是什么灰度转换算法?

c++ - 了解 Qt View 模型架构 : when to create and how to cleanup indexes in QAbstractItemModel implementation?

c++ - DeviceIoControl 对内存位置的访问无效