質問
Qtの画像にモーションブラーを追加する簡単な解決策はありますか?ぼかしについての良いチュートリアルが見つかりませんでした。私は理解できる本当にシンプルなものが必要で、ぼかしの角度を変えることができれば本当に良いでしょう。
解決
Qtにはモーションブラーフィルターがありません。私はのコードを見ました QGraphicsBlurEffect
;それは使用します QPixmapBlurEffect
それ自体が呼び出される内部ヘルパーメソッドを使用します expblur
(指数ぼかし)。
expblur
それ自体は、一次元のぼかし効果(X方向のモーションブラー、メソッド)を使用しています qt_blurrow
)二回。2つのぼかしの間で画像を90度回転させ、その後元に戻します。
だから実際には、Qt 持っています モーションブラー効果が、これは内部のみです。だからあなたはあなた自身の効果を書く必要があります。これを行うには、次のコードを見てください qt_blurrrow
, 、あなたはQtソースで見つけることができます src/gui/qpixmapfilter.cpp
.これにより、線形のぼかしフィルターではなく指数関数的なぼかしフィルターであるため、フィルターの品質が向上します。
Qtのソースコードに深く入りたくない場合は、この擬似コードを開始してください:
foreach pixel (x, y) in image {
for dx = -r to r with x+dx within image {
for dy = -r to r with y+dy within image {
Add pixel (x+dx, y+dy) of the source image with ↩
factor (matrix[dx, dy]) to the target image.
}
}
}
ここで、行列は次のように定義されます(半径2の水平モーションブラーの場合):
0 0 0 0 0
0 0 0 0 0
0.1 0.2 0.4 0.2 0.1
0 0 0 0 0
0 0 0 0 0
すべてのエントリの合計は1でなければならないか、行列エントリの合計で色を除算する必要があることに注意してください。
与えられた半径rと角度αに対してこの行列を構築することは、αに対して任意の角度(90度のステップだけでなく)を許可したい場合には困難です。[編集]:このような行列を簡単に生成するには、コメント3を参照してください。]