Bonjour,
Sur ce lien http://www.delphigroups.info/2/2/315313.html j'ai trouvé une méthode hyper rapide pour faire une rotation à droite d'un bitmap :
Avant j'utilisais directement des Scanlines sans pointeurs, mais c'était très lent.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 Procedure SZRotateBmp270(Src, Dest: TBitmap); // Rotation à droite Hyper rapide Var x, y : integer; dY : array of PDWORD; // Array for destination scanline sH, dH: integer; // Height variables P : PDWORD; // Source pixel pointer Begin if Src.PixelFormat<>pf32bit then Src.PixelFormat := pf32bit; if Dest.PixelFormat<>pf32bit then Dest.PixelFormat := pf32bit; try Dest.Width := Src.Height; Dest.Height := Src.Width; sH:=Src.Height-1; dH:=Dest.Height-1; // Initialize dynamic array SetLength(DY,dH+1); // Save pointers to array for acceleration for y := 0 to dH do DY[y] := Dest.ScanLine[y]; // Copy Src horizontal lines to be Dest vertical by +270 degree for y := sh downto 0 do begin P:=Src.ScanLine[y]; for x := 0 to dH do begin Dy[x]^:=P^; inc(Dy[x]); inc(P); end; end; finally SetLength(DY,0); end; end;
Je voudrais adapter ce code pour faire un effet miroir horizontal. Le problème c'est que je ne comprends pas tout ! si quelqu'un pouvais me l'expliquer ?
Scr et Dest sont les bitmap Source et Destination
Sh est la hauteur de Scr et dh la hauteur de Dest (qui est aussi la largeur de Scr)
DY (de 0 à Dh) est un tableau de pointeurs sur les lignes de Dest
Ensuite on balaye Scr de Sh à 0 :
P pointe sur sur une ligne horizontale de Scr
Ensuite, boucle sur x de 0 à dh, et là je suis largué ..
Je ne comprends pas :
Dy[x] et P n'ont pas même longueur ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Dy[x]^:=P^; inc(Dy[x]); inc(P);
A quoi correspond un incrément (Inc) sur un pointeur ? comment savoir sur quoi va pointer le pointeur suivant ?
surtout que Inc(P) ajoute 1, alors que Y est sur un Downto ?
A+
Charly
Partager