0

私は、それを保持しているラベルなどのトリックを行わずに、QImage使用にぼかしを適用する方法を探しています(これは別のSOの質問で示されています)。QGraphicsBlurEffectsetGraphicsEffect

blur基本的に、次のような関数を探していますQImage blur(QImage, QGraphicsBlurEffect);

と呼ばれる似たような関数が存在しますqt_blurImageが、それはプライベートヘッダーでエクスポートされるため、使用したくありません。

悲しいことに、QImage持っていませんsetGraphicsEffect

もちろん、生データで機能する独自のぼかし関数をロールすることもできますが、すでに存在するものを再実装したくはありません。

4

2 に答える 2

5

このトピックに貢献しましょう。Qt 5.3の時点で、次の関数は適用するのに大いに役立ちますQGraphicsEffectQImageそしてアルファを失うことはありません)-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、元の画像のすべての側面にピクセル数が追加されます。特に、影やぼかしが途切れないようにする場合に便利です。

于 2015-01-19T20:19:07.107 に答える
0

残念ながら、グラフィックスエフェクトAPIはとでのみ使用するように設計されているようQWidgetですQGraphicsItem。4.7ソース(私が手元にあるもの)をざっと見てみると、必要なフックはすべてプライベート/内部です。5.xソースから判断すると、これは依然として当てはまります。

あなたの唯一の選択肢はあなたが説明するもののようです:QGraphicsEffect醜いハックで使用するか、自分でぼかし/効果を実装します。(個人的には後者をお勧めします。)

于 2013-02-16T23:19:30.833 に答える