使用QGraphicsBlurEffect的QImage变换
QImage transform using QGraphicsBlurEffect
我正在寻找一种方法,使用QGraphicsBlurEffect
在QImage
上应用模糊,而不需要在包含它的标签上使用setGraphicsEffect
之类的技巧(这在另一个SO问题上演示)。
基本上,我正在寻找一个函数blur
,这样QImage blur(QImage, QGraphicsBlurEffect);
有一个有点类似的函数,叫做qt_blurImage
,但它是在一个私有标头中导出的,我不想使用它
遗憾的是,QImage
没有setGraphicsEffect
当然,我可以使用我自己的模糊函数来处理原始数据,但我宁愿不重新实现已经存在的东西。
让我们为这个主题做贡献。从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
像素数添加到原始图像的所有边,特别适用于不截断阴影和模糊。
遗憾的是,API的图形效果似乎是专为与QWidget
和QGraphicsItem
一起使用而设计的。快速查看4.7源代码(这就是我手头的),必要的钩子都是私有/内部的。从5.x的消息来源来看,情况依然如此。
你唯一的选择似乎是你所描述的:使用QGraphicsEffect
进行丑陋的破解,或者自己实现模糊/效果。(就我个人而言,我推荐后者。)
相关文章:
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 基于范围的变换以实现正常循环
- OpenCV 傅里叶变换复杂输出问题
- SFML 纹理变换(放大)
- 将 cv::mat 转换为 QImage
- 平面缓冲区可以利用向量中的 0 吗?还是其他小波比哈尔变换更好?
- 有没有一种惯用的方法可以在不存储变换或不必要地重新计算的情况下找到数组变换的最小/最大值?
- 在特征中显示仿射变换
- 将 QImage 从 c++ 客户端发送到 python 服务器
- Read OpenCV Mat 16bit to QImage 8bit Greyscale
- QImage::p ixel 和 QImage::setPixel 坐标超出范围误差
- 如何从路径加载 QImage?
- 在 QListWidget 中旋转 QImage
- 离散傅立叶变换C++
- ICP变换矩阵平移和旋转
- 如何从2D数组为QHeightMapSurfaceDataProxy创建高度图以显示2D傅立叶变换结果
- 如何为QImage检测足够的格式(数据类型)以消耗最少的RAM
- 优化从文件加载QImage
- Qt-工作线程崩溃时将cv::Mat转换为QImage
- 使用QGraphicsBlurEffect的QImage变换