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.

Foi útil?

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.]

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top