使用QGraphicsBlurEffect进行QImage变换

时间:2013-02-16 21:08:57

标签: c++ qt

我正在寻找一种方法,使用QImage将模糊应用到QGraphicsBlurEffect,而不会在保留它的标签上执行setGraphicsEffect等欺骗(这在不同的SO上展示问题)。

基本上,我正在寻找一个blur

的函数QImage blur(QImage, QGraphicsBlurEffect);

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

可悲的是,QImage没有setGraphicsEffect

我当然可以使用自己的模糊函数来处理原始数据,但我不想重新实现那些已经存在的东西。

2 个答案:

答案 0 :(得分:3)

让我们为这个话题做出贡献。从Qt 5.3开始,以下函数可以帮助您将QGraphicsEffect应用于QImage(并且不会丢失alpha),因为QWidget::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个像素数,尤其适用于阴影和模糊不能被截断。

答案 1 :(得分:0)

不幸的是,图形效果API看起来只是为了与QWidgetQGraphicsItem一起使用而设计的。通过快速查看4.7源代码(这是我手头上的内容),必要的钩子都是私有/内部的。从5.x来源来看,情况仍然如此。

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

相关问题