Effet fluidité de photoshop

Bonjour, j'essaie de réaliser le même (ou presque) effet que le filtre "Fluidité" de "Photoshop".


Voir fichier joint.


 


J'ai fait plein de recherches : j'ai vu tous les CIFilters, ainsi que les CIKernels pour faire des filtres custom persos.


 


Mais je ne vois pas comment faire cet effet.


 


En gros, j'ai besoin de pouvoir, sur une photo, étirer les pixels dans la direction où je les emmène.


 


Si quelqu'un a une idée, ce serait intéressant.


 


Merci d'avance.


 


busterTheo


 


Fichier joint :


Réponses

  • Redimensionne l'image sur l'axe x, sans toucher à  l'axe y et tu auras ton étirement.

  • Merci pour ta réponse, c'est une idée intéressante que je vais creuser et qui a le mérite d'être simple, mais j'aimerai faire cela, non pas sur toute l'image mais seulement sur la zône de contact...
  • PyrohPyroh Membre

    C'est un sujet qui est assez complexe en réalité ce que tu peux faire c'est le faire avec un mesh.


    Ton image est plaquée comme texture sur le mesh et tu déforme le mesh comme tu veux, la texture suivra.


     


    Tu peux tester dans Quartz Composer.


     


    Il va falloir que tu te débrouille pour l'algo de déformation.


  • CéroceCéroce Membre, Modérateur
    La technique de Pyroh est assez classique, et a l'avantage de pouvoir être facilement accélérée par le GPU. Son principal défaut est qu'il faut un maillage assez fin, et que des sommets du maillage peuvent se croiser. À mon avis, le résultat peut être assez bizarre.


    Voici une autre technique, qui est à  mon avis utilisée par Photoshop: on utilise une deuxième texture, dont chaque texel est un vecteur 2D indiquant un déplacement par rapport à  la position d'origine. Ensuite, il est facile de concevoir un UIKernel qui utilise les deux textures pour déplacer les pixels. Mais bon, personnellement, ici j'utiliserais directement OpenGL ES, parce que faire ça avec CoreImage s'annonce galère.

    La principale difficulté est de créer cette texture de déplacement. À l'origine, tous les vecteurs sont à  zéro. Ensuite, sur un touch, il faut additionner les déplacements horizontaux et verticaux aux vecteurs, dans un certain rayon autour du doigt.
    Ce qui est difficile est de faire cela rapidement, ce qui veut dire avec le GPU. Par exemple, moi, je dessinerais un cercle (dont le "gris" dépend du déplacement) dans un Framebuffer avec un Fragment Shader. Un deuxième Fragment shader irait additionner le framebuffer à  la texture de déplacement.

    Je ne suis pas certain du résultat, mais ce sont des choses qu'on fait assez classiquement en 3D temps réel.
  • Grand merci pour ta grande réponse et désolé pour le grand retard.

Connectez-vous ou Inscrivez-vous pour répondre.