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,只需要场景。我不认为这是黑客。