Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Apprendre à créer des transitions d'image à image avec Lazarus et BGRABitmap
Par Gilles Vasseur (5)

Le , par gvasseur58

21PARTAGES

8  0 
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.

Une erreur dans cette actualité ? Signalez-le nous !

Avatar de circular17
Membre confirmé https://www.developpez.com
Le 19/06/2018 à 11:30
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 : Sélectionner tout
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 : Sélectionner tout
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
3  0 
Avatar de circular17
Membre confirmé https://www.developpez.com
Le 08/07/2018 à 17:44
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 : Sélectionner tout
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
2  0 
Avatar de gvasseur58
Responsable Lazarus & Pascal https://www.developpez.com
Le 19/06/2018 à 14:39
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 .

Citation Envoyé par circular17 Voir le message

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 !

Citation Envoyé par circular17 Voir le message

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.

Citation Envoyé par circular17 Voir le message

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
1  0 
Avatar de gvasseur58
Responsable Lazarus & Pascal https://www.developpez.com
Le 19/06/2018 à 17:30
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 : Sélectionner tout
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
1  0