Qt de movimento (linear) borrão
-
12-12-2019 - |
Pergunta
Existe uma solução simples para adicionar o borrão de movimento a uma imagem em Qt?Não encontrei nenhum bom tutorial sobre a desfocagem.Eu preciso de uma coisa muito simples, que eu pudesse entender, e seria muito bom se eu pudesse mudar o desfoque de ângulos.
Solução
Qt não tiver um filtro de desfoque de movimento.Eu olhei para o código de QGraphicsBlurEffect
;ele usa QPixmapBlurEffect
o que se usa um auxiliar interno método chamado expblur
(exponencial blur).
expblur
se usa um one-dimensional efeito blur (desfoque de movimento na direção X, método qt_blurrow
) duas vezes.Ele gira a imagem entre os dois borrões de 90 graus e depois gira-lo de volta.
Então, na verdade, Qt tem um efeito de desfoque de movimento, mas este é apenas interno.Então, você precisa escrever o seu próprio efeito.Para fazer isso, dê uma olhada no código de qt_blurrrow
, o que você pode encontrar no Qt fontes src/gui/qpixmapfilter.cpp
.Isso dará a você uma boa qualidade para o filtro, pois é uma exponencial filtro desfoque em vez de linear.
Se você não quiser ir tão fundo no código fonte do Qt, tome este pseudo-código de como começar:
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.
}
}
}
onde a matriz pode ser definido como esta (horizontal motion blur com raio de 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
Observe que a soma de todas as entradas tem que ser 1, ou você tem para dividir as cores pela soma da matriz de entradas.
A construção desta matriz para um dado raio r e ângulo α é difícil quando você deseja permitir arbitrário ângulos α (não só em passos de 90 graus).[EDITAR:Veja o comentário 3 para facilitar a geração de uma tal matriz.]