Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用qgraphicsblueffect的QImage变换_C++_Qt - Fatal编程技术网

C++ 使用qgraphicsblueffect的QImage变换

C++ 使用qgraphicsblueffect的QImage变换,c++,qt,C++,Qt,我正在寻找一种方法,使用qgraphicsblueffect在QImage上应用模糊,而不在保存它的标签上使用setGraphicsEffect之类的诡计(这在另一个SO问题上演示) 基本上,我正在寻找一个函数blur,这样QImage blur(QImage,qgraphicsblueffect) 存在一个类似的函数,名为qt_blurImage,但它是在私有头中导出的,我不想使用它 遗憾的是,QImage没有setGraphicsEffect 当然,我可以使用自己的模糊功能来处理原始数据,但

我正在寻找一种方法,使用
qgraphicsblueffect
QImage
上应用模糊,而不在保存它的标签上使用
setGraphicsEffect
之类的诡计(这在另一个SO问题上演示)

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

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

遗憾的是,
QImage
没有
setGraphicsEffect


当然,我可以使用自己的模糊功能来处理原始数据,但我不想重新实现已有的功能。

不幸的是,图形效果API似乎是专门为
QWidget
QGraphicsItem
设计的。通过快速查看4.7源代码(这是我手头上的),必要的钩子都是私有的/内部的。从5.x的来源来看,情况仍然如此


看起来你唯一的选择就是你所描述的:使用
QGraphicsEffect
,或者自己实现模糊/效果。(我个人推荐后者。)

不幸的是,图形效果API似乎是专门为
QWidget
QGraphicsItem
设计的。通过快速查看4.7源代码(这是我手头上的),必要的钩子都是私有的/内部的。从5.x的来源来看,情况仍然如此


看起来你唯一的选择就是你所描述的:使用
QGraphicsEffect
,或者自己实现模糊/效果。(就我个人而言,我推荐后者。)

让我们为这个话题做些贡献。从Qt5.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);

请注意“范围”参数,它会将
范围
像素数添加到原始图像的所有侧面,对于阴影和模糊不被截断尤其有用。

让我们为本主题做贡献。从Qt5.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
像素数添加到原始图像的所有侧面,特别适用于阴影和模糊不被切断。

QWidget::grab以前是一个选项,现在唯一合法的方法是在QGraphicsSitem上调用QGraphicscene::render并设置效果。这不需要QGraphicsView,只需要场景。我不认为它是黑客。QWIDGET::抓取是一种选择之前,现在唯一合法的方式是调用QGraceCsField::在QGrimeCiStEM上渲染效果集。这不需要QGraphicsView,只需要场景。我不认为这是黑客。