我正在寻找一种方法来将模糊应用到QImageusing 上QGraphicsBlurEffect而无需在setGraphicsEffect持有它的标签上进行欺骗(这在不同的 SO 问题上进行了演示)。
基本上,我正在寻找一个函数blur,这样QImage blur(QImage, QGraphicsBlurEffect);
存在一个有点类似的函数,qt_blurImage但它被导出到一个私有头文件中,我宁愿不使用它。
遗憾的是,QImage没有setGraphicsEffect
我当然可以推出我自己的适用于原始数据的模糊功能,但我宁愿不重新实现已经存在的东西。
让我们为这个主题做出贡献。由于Qt的5.3,以下功能将帮助你很多在施加QGraphicsEffect到QImage(而不失阿尔法) -因为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;
}
Run Code Online (Sandbox Code Playgroud)
他们,使用此功能模糊您的图像很简单:
QGraphicsBlurEffect *blur = new QGraphicsBlurEffect;
blur->setBlurRadius(8);
QImage source("://img1.png");
QImage result = applyEffectToImage(source, blur);
result.save("final.png");
Run Code Online (Sandbox Code Playgroud)
当然,你不需要保存它,这只是一个有用的例子。您甚至可以添加阴影:
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);
Run Code Online (Sandbox Code Playgroud)
并注意范围参数,它extent为原始图像的所有边增加了像素数,对于阴影和模糊不被截断特别有用。
| 归档时间: |
|
| 查看次数: |
2178 次 |
| 最近记录: |