将QImage(图标)转换为灰度格式,同时保留背景

问题描述 投票:0回答:2

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

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
2个回答
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);

0
投票

另一种解决方案是保持 alpha 通道将图像转换为灰色并将其转换回 ARGB

auto alphaChannel = image.alphaChannel();
image.convertTo(QImage::Format_Grayscale16);
image.convertTo(QImage::Format_ARGB32);
image.setAlphaChannel(alphaChannel);
© www.soinside.com 2019 - 2024. All rights reserved.