이 주제에 기여하겠습니다. Qt 5.3부터 다음 함수는 을 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;
}
그들
은 간단하다 :
물론
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
수를 추가하고 수 없습니다 차단을 흐리게합니다.
QWidget :: grab은 전에 옵션 이었지만, 이제 유일한 합법적 인 방법은 QGraphicsItem의 QGraphicsScene :: render를 호출하여 효과를 얻는 것입니다. 당신은 QGraphicsView를 필요로하지 않습니다. 단지 장면입니다. 나는 그것을 해킹으로 생각하지 않는다. –