Image processing 将图形过滤器应用于Qt5中的QIcon

Image processing 将图形过滤器应用于Qt5中的QIcon,image-processing,graphics,icons,qt5,Image Processing,Graphics,Icons,Qt5,令我惊讶的是,我正在尝试做一件比最初预想的要难得多的事情。我有一个32位png的小位图资源,我想在将其着色为特定颜色后显示为图标 我遇到过这个班和它的孩子们,但除非我设置了一个完整的场景图,这对于我来说有点过分了(用不同的颜色渲染一个16x16图标),否则它不会工作 我在Qt4中也遇到过这门课,但在Qt5中我找不到任何关于这门课的参考资料。它被移除了吗 此外,还有一些明显的过滤器在图标上工作,如图中所示,同时进行着色和模糊处理 那么,我如何才能在Qt5中完成这个简单的任务呢?在得到更好的答案之前

令我惊讶的是,我正在尝试做一件比最初预想的要难得多的事情。我有一个32位png的小位图资源,我想在将其着色为特定颜色后显示为图标

我遇到过这个班和它的孩子们,但除非我设置了一个完整的场景图,这对于我来说有点过分了(用不同的颜色渲染一个16x16图标),否则它不会工作

我在Qt4中也遇到过这门课,但在Qt5中我找不到任何关于这门课的参考资料。它被移除了吗

此外,还有一些明显的过滤器在图标上工作,如图中所示,同时进行着色和模糊处理


那么,我如何才能在Qt5中完成这个简单的任务呢?

在得到更好的答案之前,我决定分享我最终使用的方法。这不是一个非常优雅的解决方案,但它很有效。它保持了透明度,我也在SVG资源上对它进行了测试

Qt5的着色图标功能:

#include <QPainter>
#include <QPixmap>
#include <QImage>
#include <QGraphicsEffect>

QImage tint(QImage src, QColor color, qreal strength=1.0){
    if(src.isNull()) return QImage();
    QGraphicsScene scene;
    QGraphicsPixmapItem item;
    item.setPixmap(QPixmap::fromImage(src));
    QGraphicsColorizeEffect effect;
    effect.setColor(color);
    effect.setStrength(strength);
    item.setGraphicsEffect(&effect);
    scene.addItem(&item);
    QImage res(src);
    QPainter ptr(&res);
    scene.render(&ptr, QRectF(), src.rect() );
    return res;
}
QIcon ic(QPixmap::fromImage(tint(QImage("://icons/spider.svg"),QColor(192,0,0),1.0)));

这会从任意图形资源中生成一个容易着色的
QIcon
实例。

在得到更好的答案之前,我决定分享我最终使用的方法。这不是一个非常优雅的解决方案,但它很有效。它保持了透明度,我也在SVG资源上对它进行了测试

Qt5的着色图标功能:

#include <QPainter>
#include <QPixmap>
#include <QImage>
#include <QGraphicsEffect>

QImage tint(QImage src, QColor color, qreal strength=1.0){
    if(src.isNull()) return QImage();
    QGraphicsScene scene;
    QGraphicsPixmapItem item;
    item.setPixmap(QPixmap::fromImage(src));
    QGraphicsColorizeEffect effect;
    effect.setColor(color);
    effect.setStrength(strength);
    item.setGraphicsEffect(&effect);
    scene.addItem(&item);
    QImage res(src);
    QPainter ptr(&res);
    scene.render(&ptr, QRectF(), src.rect() );
    return res;
}
QIcon ic(QPixmap::fromImage(tint(QImage("://icons/spider.svg"),QColor(192,0,0),1.0)));
这将从任意图形资源生成一个易于着色的
QIcon
实例