Sfocatura Qt Motion (lineare)
-
12-12-2019 - |
Domanda
C'è una soluzione semplice per aggiungere motion blur a un'immagine in qt?Non ho trovato nessun buon tutorial sulla sfocatura.Ho bisogno di qualcosa di veramente semplice, che potevo capire, e sarebbe davvero bravo se potessi cambiare gli angoli di sfocatura.
Soluzione
Qt non ha un filtro sfocatura movimento. Ho esaminato il codice di QGraphicsBlurEffect
; Utilizza QPixmapBlurEffect
che utilizza un metodo di helper interno chiamato expblur
(sfocatura esponenziale).
expblur
stesso utilizza un effetto sfocatura monodimensionale (sfocatura del movimento in direzione X, metodo qt_blurrow
) due volte. Ruota l'immagine tra le due sfocature di 90 gradi e succedendo indietro indietro.
Quindi in realtà, qt ha un effetto sfocatura di movimento ma questo è solo interno. Quindi devi scrivere il tuo effetto. Per fare ciò, dai un'occhiata al codice di qt_blurrrow
, che puoi trovare nelle fonti QT di src/gui/qpixmapfilter.cpp
. Questo ti darà una buona qualità per il filtro, poiché è un filtro sfocatura esponenziale anziché un lineare.
Se non vuoi andare così in profondità nel codice sorgente QT, prendi questo pseudo-codice come inizio:
.
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.
}
}
}
Dove potrebbe essere definito la matrice come questa (per la sfocatura del movimento orizzontale con il raggio 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
Si noti che la somma di tutte le voci deve essere 1, oppure devi dividere i colori con la somma delle voci della matrice.
Costruire questa matrice per un determinato raggio R e angolo α è difficile quando si desidera consentire angoli arbitrari per α (non solo 90 gradi). [Modifica: vedere il commento 3 per una generazione facile di una tale matrice.]