IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Codes sources à télécharger Delphi Discussion :

[FMX] Effet de distorsion d'une image


Sujet :

Codes sources à télécharger Delphi

  1. #1
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 696
    Billets dans le blog
    2
    Par défaut [FMX] Effet de distorsion d'une image
    Bonjour,

    Je vous propose un petit effet de distorsion sinusoïdale comme on pouvait en voir dans les jeux vidéo de mon enfance (exemple l'animation du fond dans le monde 2 de Thunder Force 3 sur Megadrive
    )

    J'avais besoin d'un tel effet sur un jeu que je suis en train de développer.

    L'exemple proposé est un exemple pour Delphi FMX pur (pas d'utilisation de shader). Çà tourne pas mal sur de petites images mais pour optimiser cela, il faudrait passer par des shaders

    Le principe est simple : on stocke l'image originale dans un TBitmap et on dessine dans un autre TBitmap. En fonction de différents critères (amplitude en X, fréquence en X, amplitude en Y, fréquence en X, fréquence en Y et de vitesse), on va récupérer la couleur du pixel à des coordonnées calculées pour écrire dans le pixel (x,y) du TBitmap de sortie cette couleur.

    Par exemple, si on souhaite une amplitude de 50 sur X, dans le TBitmap de sortie, on va forcer la couleur du pixel (x,y) à la couleur du pixel (x+50, y) du TBitmap d'origine. On utilise une fonction sinusoïdale pour affiner le rendu et aller progressivement de l'amplitude 0 à 50 puis de 50 à 0 et cela indéfiniment.
    Nom : distorsion.png
Affichages : 168
Taille : 457,7 Ko

    Le ZIP du projet est dispo ici : DistortionDemo.7z
    Mon site - Mes tutoriels - GitHub - Youtube - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 696
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    J'ai apporté quelques optimisations par rapport à la première version postée. En effet, dans la première version, je faisais les calculs pour chaque pixel (x,y).
    Or, sur une ligne donnée de l'image, le décalage en X est toujours le même. Il en est de même pour chaque colonne de l'image.
    Pour éviter de faire les calculs pour chaque pixel, dans cette version optimisée, j'ai ajouté deux tableaux FSinTable et FCosTable.
    Ils sont dimensionnés dans le constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SetLength(FSinTable, FOriginal.Height);
    SetLength(FCosTable, FOriginal.Width);
    FSinTable est taillé à la hauteur de l'image d'origine et FCosTable est taillé à la largeur de l'image d'origine.

    Je remplis ces tableaux dans la fonction ApplyDistortion dès que le paramètre time évolue (le paramètre time sert au calcul des valeurs).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    BuildSinTable(FOriginal.Height);
    BuildCosTable(FOriginal.Width);
    Voici le code de la fonction BuildSinTable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TDistortion.BuildSinTable(const AHeight: Integer);
    begin
      for var i := 0 to AHeight - 1 do
        FSinTable[i] := Round(Sin(time + i * frequencyX) * amplitudeX);
    end;
    La fonction BuildCosTable est similaire sauf qu'elle prend en paramètre la largeur de l'image et appelle la fonction Cos à la place de Sin et elle utilise évidemment frequenceY et amplitudeY.

    Avec ces deux tableaux alimentés avec les valeurs calculées, dans la fonction ApplyDistortion, les for imbriqués de parcours de l'image pixel par pixel deviennent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    for var y := 0 to FOriginal.Height - 1 do begin
       for var x := 0 to FOriginal.Width - 1 do begin
         var newX := x + FSinTable[y];
         var newY := y + FCosTable[x];
     
         if inRange(newX, 0, FOriginal.Width) and inRange(newY, 0, FOriginal.Height) then
           srcColor := SrcData.GetPixel(newX, newY)
         else
           srcColor := TAlphaColors.Null;
     
         DstData.SetPixel(x, y, srcColor);
       end;
    end;
    On ne fait donc plus les calculs pour chaque pixel (si l'image fait x * y pixels, ma première version faisait x * y fois les calculs. En passant par les tableaux cela occupe un peu plus de mémoire (en fonction de la taille de l'image), mais les calculs ne sont faits que x + y fois à chaque rendu.

    Voici la nouvelle version du projet : DistortionDemo2.7z
    Je conserve la première version dans le premier message si vous souhaitez faire des comparaisons.
    Mon site - Mes tutoriels - GitHub - Youtube - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

Discussions similaires

  1. Comment réaliser cet effet de texte sur une image ?
    Par creale10 dans le forum jQuery
    Réponses: 4
    Dernier message: 25/07/2012, 14h28
  2. Effet de couleur sur une image
    Par icesiiik dans le forum JavaFX
    Réponses: 1
    Dernier message: 26/04/2011, 02h42
  3. Calibration et distorsion d'une image
    Par tasse2café dans le forum OpenCV
    Réponses: 2
    Dernier message: 25/11/2010, 16h46
  4. [Article] Appliquer un effet de zoom sur une image avec les CSS
    Par Bovino dans le forum Publications (X)HTML et CSS
    Réponses: 1
    Dernier message: 17/10/2010, 08h53
  5. problème avec un rollover (effet de survol) sur une image/bouton
    Par f56bre dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 19/03/2007, 15h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo