2013-02-16 5 views
0

나는 에 setGraphicsEffect과 같은 속임수를 사용하지 않고 QGraphicsBlurEffect을 사용하여 흐림 효과를 적용 할 방법을 찾고 있습니다. (이것은 다른 SO 질문에 나와 있습니다).QImage QGraphicsBlurEffect를 사용하여 변환

기본적으로,이 함수를 찾고 있어요 blur 등이 QImage blur(QImage, QGraphicsBlurEffect);

qt_blurImage라는 존재에 다소 유사한 기능이있어하지만이 개인 헤더에 내 보낸 나는 오히려 그것을 사용하지 것입니다.

슬프게도, QImage 나는 물론 원시 데이터에서 작동 내 자신의 흐리게 기능을 출시 할 수있는 setGraphicsEffect

이없는하지만 난 오히려 이미 뭔가를 다시 구현하지 것입니다.

답변

0

그래픽 효과 API는 QWidgetQGraphicsItem과 함께 사용하기 위해 설계된 것 같습니다. 4.7 소스 (필자가 가지고있는 것)를 간략하게 살펴보면 필요한 후크는 모두 개인/내부입니다. 5.x 출처에서 볼 때, 이것은 여전히 ​​그렇습니다.

당신이 생각하는 유일한 선택 인 것 같습니다 : QGraphicsEffect을 추한 해킹으로 사용하거나 직접 흐림 효과를 구현하십시오. (개인적으로 나는 후자를 추천 할 것입니다.)

+0

QWidget :: grab은 전에 옵션 이었지만, 이제 유일한 합법적 인 방법은 QGraphicsItem의 QGraphicsScene :: render를 호출하여 효과를 얻는 것입니다. 당신은 QGraphicsView를 필요로하지 않습니다. 단지 장면입니다. 나는 그것을 해킹으로 생각하지 않는다. –

2

이 주제에 기여하겠습니다. 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 수를 추가하고 수 없습니다 차단을 흐리게합니다.