[英]Convert QImage(icon) to grayScale format while keeping background
我想将图标转换为灰度格式(以向用户提供禁用操作反馈),如下所示:
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);
}
但是结果很糟糕,背景也转换为灰色:
那我该怎么办?
为了保持背景透明,您需要使图像具有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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.