Developpez.com - Rubrique Lazarus

Le Club des Développeurs et IT Pro

Apprendre à créer des transitions d'image à image avec Lazarus et BGRABitmap

Par Gilles Vasseur (5)

Le 2018-06-15 07:21:51, par gvasseur58, Responsable Lazarus & Pascal
Apprendre à créer des transitions d'image à image - Rotations, homothéties et filtres
Avec Lazarus et BGRABitmap

Bonjour à toutes et à tous !

Nous poursuivons notre exploration des différents types de transitions d'image à image en nous penchant sur les rotations, les homothéties et les filtres. Ce sont trois nouvelles occasions d'approfondir notre connaissance de la bibliothèque BGRABitmap.

Voici par exemple une des transitions que vous obtiendrez en lisant ce tutoriel :


Pour lire le tutoriel, c'est ici : https://gilles-vasseur.developpez.co...sitions/bgra5/

Épisodes précédents :

Partie 1 : Installation et application de démonstration
Partie 2 : Les transitions simples
Partie 3 : Travailler avec des masques
Partie 4 : Bandes et splines

Que pensez-vous de ce tutoriel ?
Quelle utilisation faites-vous du graphisme avec Lazarus ?

Retrouvez les meilleurs cours et tutoriels pour apprendre la programmation avec Lazarus.
  Discussion forum
4 commentaires
  • circular17
    Membre confirmé
    Merci pour le tutoriel. Toujours content de voir ma bibliothèque en action.

    Au sujet de la rapidité d'exécution, il est possible d'accélérer le redimensionnement en utilisant le paramètre rmSimpleStretch avec Resample.

    Concernant l'allocation d'objets intermédiaires, il est en fait possible de dessiner et redimensionner en une instruction StretchPutImage.
    Code :
    1
    2
    3
    LX := (imgResult.ClientWidth - fBGRATo.Width) div 2;
    LY := (imgResult.ClientHeight - fBgraTo.Height) div 2;
    LBGRATemp.StretchPutImage(Rect(LX, LY, fStep * imgResult.ClientWidth  div 100, fStep * imgResult.ClientHeight div 100), fBGRATo, dmDrawWithTransparency, Opacity);
    Enfin, le BGRAReplace est un peu superflu dans le dernier exemple.

    Tu peux écrire directement :
    Code :
    1
    2
    3
    LBGRABlurMotion := LBGRABlurMotion.FilterBlurMotion(100 - fStep, 100 - fStep, False) as TBGRABitmap;
    LBGRATemp.PutImage(LX, LY, LBGRABlurMotion, dmDrawWithTransparency, Opacity);
    LBGRABlurMotion.Free;
    Après, le flou de déplacement est un peu compliqué à calculer alors oui c'est un peu lent. Peut-être qu'il serait possible de faire une version plus rapide avec un peu moins de qualité.

    Cordialement
  • circular17
    Membre confirmé
    Bonjour,

    Ah oui, je me suis trompé dans les paramètres de Rect. Les dernières paramètres sont Right et Bottom et non pas Width et Height.

    Note sinon la fonction RectWithSize marche bien à la place. Elle est comme Rect mais prend Width et Height comme paramètres:
    Code :
    1
    2
    3
    LX := (imgResult.ClientWidth - fBGRATo.Width) div 2;
    LY := (imgResult.ClientHeight - fBgraTo.Height) div 2;
    LBGRATemp.StretchPutImage(RectWithSize(LX, LY, fStep * imgResult.ClientWidth  div 100, fStep * imgResult.ClientHeight div 100), fBGRATo, dmDrawWithTransparency, Opacity);
    Cordialement
  • gvasseur58
    Responsable Lazarus & Pascal
    Bonjour Johann,

    Merci de t'intéresser à ces tutoriels : rien ne vaut le concepteur de la bibliothèque pour repérer les faiblesses de son utilisation .

    Envoyé par circular17

    Concernant l'allocation d'objets intermédiaires, il est en fait possible de dessiner et redimensionner en une instruction StretchPutImage.
    Cette méthode m'avait échappé et je vais voir à quels moments elle peut être utile, y compris dans le composant final !

    Envoyé par circular17

    Enfin, le BGRAReplace est un peu superflu dans le dernier exemple.
    Ton "un peu" est indulgent : j'ai changé le code dans le tutoriel et je t'ai évidemment ajouté à la liste des contributeurs.

    Envoyé par circular17

    Après, le flou de déplacement est un peu compliqué à calculer alors oui c'est un peu lent. Peut-être qu'il serait possible de faire une version plus rapide avec un peu moins de qualité.
    La formule que j'ai employée est peut-être malheureuse, car ton implémentation du flou est vraiment efficace. C'est tout bonnement le flou qui pose en général problème. Cela dit, dans le composant final, les
    performances ne sont pas si mauvaises que ça en choisissant de bons paramètres.

    Encore merci et au plaisir de te lire,

    Gilles
  • gvasseur58
    Responsable Lazarus & Pascal
    Re-bonjour,

    J'ai testé ton code, mais, sauf erreur de ma part, il ne fonctionne pas tel quel : fBGRATo étant une image fixe, il n'y a pas le déplacement voulu des coordonnées de départ (le centre) vers le coin supérieur gauche. Les formules sont un peu plus complexes :

    Code :
    1
    2
    3
    4
    5
    LX := (imgResult.ClientWidth - fStep * imgResult.ClientWidth div 100) div 2;
      LY := (imgResult.ClientHeight - fStep * imgResult.ClientHeight div 100) div 2;
      LBGRATemp.StretchPutImage(Rect(LX, LY, LX + fStep * imgResult.ClientWidth div 100,
          LY + fStep * imgResult.ClientHeight div 100), fBGRATo, dmDrawWithTransparency,
          Opacity);
    Cela n'enlève rien à ta remarque : l'utilisation de StretchPutImage est plus efficace et plus élégante. En revanche, les calculs sont un peu plus difficiles à établir...

    Dans le composant final, les méthodes sont bien plus simples et StretchPutImage devrait naturellement trouver sa place dans ... la prochaine version .

    Cordialement,

    Gilles