c++ - 使用 QGraphicsBlurEffect 进行 QImage 变换

标签 c++ qt

我正在寻找一种使用 QGraphicsBlurEffect 将模糊应用到 QImage 上的方法,而无需在包含的标签上使用 setGraphicsEffect 等技巧它(这在另一个 SO 问题上得到了证明)。

基本上,我正在寻找一个函数 blur 这样 QImage blur(QImage, QGraphicsBlurEffect);

存在一个名为 qt_blurImage 的类似函数,但它是在私有(private) header 中导出的,我不想使用它。

遗憾的是,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 参数,它将 extent 像素数添加到原始图像的所有边,特别适用于不被截断的阴影和模糊。

关于c++ - 使用 QGraphicsBlurEffect 进行 QImage 变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14915129/

相关文章:

c++:我自己的类的动态数组

c++ - Linux,如何截屏,模拟鼠标移动

c++ - 确保 QByteArray 拥有它的内存 (QByteArray::fromRawData)

c++ - 检查 Visual Studio 2010 的 C++ 项目中的特定配置

c++ - 字体轮廓贝塞尔曲线样条轮廓和 DirectWrite

c++ - 在 Qt 中更改标签图像

c++ - 如何在 Qt 中使菜单项变灰

c++ - Qt/C 如何读取当前在帧缓冲区中的图像?

linux - iwlib 尝试获取访问点名称 - u.addr.sa_data 包含可疑字符,导致 QString 为空

c++ - OpenCV 2.4.8 编译链接错误