0

我正在寻找一种方法来应用模糊到QImageusingQGraphicsBlurEffect而不做诡计,例如setGraphicsEffect在持有它的标签上(这在不同的 SO 问题上得到证明)。

基本上,我正在寻找blur这样的功能QImage blur(QImage, QGraphicsBlurEffect);

存在一个类似的函数,qt_blurImage但它在私有标头中导出,我宁愿不使用它。

可悲QImage的是,没有setGraphicsEffect

我当然可以推出我自己的适用于原始数据的模糊功能,但我宁愿不重新实现已经存在的东西。

4

2 回答 2

5

让我们为这个话题做出贡献。从 Qt 5.3 开始,以下函数将对您应用(而不是丢失 alpha)有很大帮助QGraphicsEffect-因为它再次处于回归中。QImageQWidget::grab()

QImage applyEffectToImage(QImage src, QGraphicsEffect *effect, int extent=0)
{
    if(src.isNull()) return QImage();   //No need to do anything else!
    if(!effect) return src;             //No need to do anything else!
    QGraphicsScene scene;
    QGraphicsPixmapItem item;
    item.setPixmap(QPixmap::fromImage(src));
    item.setGraphicsEffect(effect);
    scene.addItem(&item);
    QImage res(src.size()+QSize(extent*2, extent*2), QImage::Format_ARGB32);
    res.fill(Qt::transparent);
    QPainter ptr(&res);
    scene.render(&ptr, QRectF(), QRectF( -extent, -extent, src.width()+extent*2, src.height()+extent*2 ) );
    return res;
}

他们,使用这个功能来模糊你的图像很简单:

QGraphicsBlurEffect *blur = new QGraphicsBlurEffect;
blur->setBlurRadius(8);
QImage source("://img1.png");
QImage result = applyEffectToImage(source, blur);
result.save("final.png");

当然,你不需要保存它,这只是一个有用的例子。你甚至可以投下阴影:

QGraphicsDropShadowEffect *e = new QGraphicsDropShadowEffect;
e->setColor(QColor(40,40,40,245));
e->setOffset(0,10);
e->setBlurRadius(50);
QImage p("://img3.png");
QImage res = applyEffectToImage(p, e, 40);

并注意范围参数,它将extent像素数添加到原始图像的各个方面,特别适用于不被切断的阴影和模糊。

于 2015-01-19T20:19:07.107 回答
0

不幸的是,看起来图形效果 API 是专为与 和 一起使用而设计QWidgetQGraphicsItem。快速查看 4.7 源代码(这是我手头的),必要的钩子都是私有的/内部的。从 5.x 的源码来看,还是这样的。

似乎您唯一的选择就是您描述的那些:QGraphicsEffect与丑陋的黑客一起使用,或者自己实现模糊/效果。(就个人而言,我会推荐后者。)

于 2013-02-16T23:19:30.833 回答