TRANSPOSITION D'IMAGES À PARTIR D'UNE ÉQUATION

cs_internaute Messages postés 8 Date d'inscription jeudi 6 juin 2002 Statut Membre Dernière intervention 8 août 2005 - 8 août 2005 à 23:19
 florenth - 9 août 2005 à 11:59
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/33129-transposition-d-images-a-partir-d-une-equation

Assez sympa comme truc.
Les effets sont au rendez-vous.

Par contre j'ai quelques petites remarques:
- Comme il s'agit d'une animation, tu changes beaucoup les pixels de ton image, cela fait naître un scintillement. Pour l'enlever, rajoute simplement DoubleBuffered := True dans le OnCreate de ta fiche.

- L'acces aux pixels de ton bitmap est très long car la propriété Pixels[] du TCanvas fait appel à l'API GetPixel et SetPixel tout en vérifiant les limites de débordement (d'ailleurs dans ton cas, heureusement qu'il y en a des vérifications car tu a fait une "grosse" bétise", voir plus loin).

=> Solution, utiliser la propriété ScanLine[] du TBitmap qui retourne un pointeur DIRECT vers les pixels dans la mémoire (plus besion d'API et donc jusqu'a 30 fois plus rapide).
Utilise la méthode avec Pixelformat := pf24Bit;
Voila un bon lien : http://nono40.developpez.com/tutoriel/delphi/efg/scanline/

- Comme pour tout tableau dynamique les pixels d'un bitmap vont, dnas le sens vertical, de Y := 0 jusqu'a Y := Height -1 et, dans le sens horisontal, de X := 0 à X := Width -1.

Tu l'as donc vu, les pixels s'arretent à Width-1 et Height-1. C'est un sacré gros piège à éviter pour ne pas se prendre une violation d'accès (parce qu'avec ScanLine[], plus de vérifications externes, c'est à toi de les faire, mais pas de quoi s'arracher les cheveux).

(En fait, le piège, c'est que pour les string ça va de 1 à Length(String) et que pour les tableaux, ça va de 0 à Length(Tableau)-1. )

- Pour le problème du bitmap qui doit être dans la fiche, c'est simple: il suffit de placer un bouton, un TOpenPictureDialog (onglet Dialogues) et dans l'évenement OnClick du bouton mettre:

begin
OpenPictureDialog.Filter := 'Fichiers bitmap|*.bmp';
if OpenPictureDialog.Execute then
Image_originale.Picture.Bitmap.LoadFromFile(OpenPictureDialog.FileName);
end;

- Si tu as n'importe quelle question à propos de ce que je t'ai dit, poste à la suite.
Ou si c'est vraiment une question à part entière, poses-là sur le forum.

@ ++ sur DelphiFR
Florent.

PS: je mettrai bien 08/10 mais le système de note ne fonctionne pas.
cs_internaute Messages postés 8 Date d'inscription jeudi 6 juin 2002 Statut Membre Dernière intervention 8 août 2005
8 août 2005 à 23:19
Par contre comme je suis encore débutant, toutes remarques sur le code, la façon de faire, les commentaires, la syntaxe, etc.... sont les bienvenue!

Merci d'avance
Rejoignez-nous