2009-04-25 11 views
5

Intento crear algo así como el filtro Liquify en Photoshop. He estado leyendo el código de distorsión de imagen, pero estoy luchando para descubrir qué creará efectos similares. La referencia más cercana que pude encontrar fue el filtro iWarp en Gimp pero el código para eso no se comenta en absoluto.Liquify filter/iwarp

También he visto en lugares como ImageMagick, pero no tengo nada en esta área

Cualquier indicador o una descripción de algoritmos sería muy apreciada.

Respuesta

0

Disculpe si hago que esto suene un poco simplista, no estoy seguro de cuánto sabe acerca de la programación gfx o incluso qué técnicas está utilizando (lo haría con HLSL).

La forma en que abordaría este problema es generar una textura que contiene desplazamientos de coordenadas x/y en los canales de r/g. A continuación, el color de salida de un píxel sería:
Textura inputImage
Textura distortionMap
de color (x, y) = inputImage (x + distortionMap (x, y) .R, y + distortionMap (x, y) .G)
(a decir verdad, esto no es del todo bien, usando los colores como compensaciones directamente significa que sólo se puede representar vectores positivos, es lo suficientemente simple para restar 0,5 para que pueda representar vectores negativos)

Ahora el único El problema que queda es cómo generar este mapa de distorsión, que es una pregunta completamente diferente (cualquier imagen generaría una distorsión de algún tipo, obviamente, trabajar en un efecto licuado apropiado es bastante complejo y lo dejaré en algunos eone más calificado).

0

Creo que licuar funciona al alterar una grilla.
Imagine que cada píxel se define por su ubicación en la cuadrícula.
Ahora cuando el usuario hace clic en una ubicación y mueve el mouse, cambia la ubicación de la cuadrícula.
La nueva grilla se proyecta nuevamente en el espacio de vista 2D del usuario.

0

Compruebe this tutorial sobre una forma de implementar el filtro licuar con Javascript. Básicamente, en el tutorial, el efecto se realiza transformando las coordenadas cartesianas de píxeles (x, y) a las coordenadas polares (r, α) y luego aplicando Math.sqrt en r.