2009-04-25 5 views
5

Sto cercando di creare qualcosa come il filtro Fluidifica in Photoshop. Ho letto il codice di distorsione delle immagini, ma ho difficoltà a scoprire cosa creerà effetti simili. Il riferimento più vicino che ho trovato è stato il filtro iWarp in Gimp, ma il codice per questo non è affatto commentato.Liquify filter/iwarp

Ho anche guardato luoghi come ImageMagick, ma non hanno nulla in questo settore

Tutti gli indicatori o una descrizione di algoritmi sarebbe molto apprezzato.

risposta

0

Scusami se faccio sembrare un po 'semplicistico questo suono, non sono sicuro di quanto tu sappia sulla programmazione gfx o anche su quali tecniche stai usando (lo farei io stesso con HLSL).

Il modo in cui vorrei affrontare questo problema è generare una trama che contenga offset delle coordinate x/y nei canali r/g. Quindi il colore di uscita di un pixel potrebbe essere:
Texture inputImage
testura distortionMap
colore (x, y) = inputImage (x + distortionMap (x, y) .R, y + distortionMap (x, y) .G)
(a dire il vero questo non è giusto, utilizzando i colori come offset significa direttamente si può rappresentare solo vettori positivi, è abbastanza semplice per sottrarre 0.5 in modo da poter rappresentare vettori negativi)

Ora l'unica il problema che rimane è come generare questa mappa di distorsione, che è una domanda completamente diversa (qualsiasi immagine potrebbe generare una distorsione di qualche tipo, ovviamente, lavorare su un effetto di fluidificazione adeguato è piuttosto complesso e lo lascerò a eone più qualificato).

0

Penso che liquefare funzioni alterando una griglia.
Immaginate che ogni pixel sia definito dalla sua posizione sulla griglia.
Ora, quando l'utente fa clic su una posizione e sposta il mouse, modifica la posizione della griglia.
La nuova griglia viene nuovamente proiettata nello spazio di visualizzazione 2D dell'utente.

0

Controllare this tutorial su un modo per implementare il filtro fluidifica con Javascript. Fondamentalmente, nel tutorial, l'effetto viene eseguito trasformando le coordinate cartesiane pixel (x, y) in coordinate polari (r, α) e quindi applicando Math.sqrt su r.