Bonjour,
Je cherche à faire un algorithme qui me fait tourner une image d'un certain angle. J'ai réussi à écrire un truc qui marche en calculant la nouvelle position de chaque pixel après rotation et à placer chaque pixel à sa nouvelle position dans une nouvelle image temporaire.
Le problème, c'est que même sur une image pas très très grosse, ça fait pas mal de calcul et du coup si je dessine l'image toute les x secondes avec un TTimer, ça rame pas mal dès que je demande une cadence suffisamment élevée pour que la rotation apparaisse fluide.
Voilà mon code :
(Les "128","200", etc. servent juste à bidouiller pour que ça tourne bien autour du centre de l'image.)
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 procedure TForm2.Timer1Timer(Sender: TObject); var i,j,x,y:integer; begin Form2.Canvas.brush.color := clwhite; imagetemp := TBitmap.create; imagetemp.width:=500; imagetemp.height:=500; for i := 0 to imagetemp.Width do begin for j:= 0 to imagetemp.height do begin x := 128+round((i-200)*cos(Pi*angle/180)-(j-200)*sin(Pi*angle/180)); y := 99+round((i-200)*sin(Pi*angle/180)+(j-200)*cos(Pi*angle/180)); imagetemp.Canvas.Pixels[i+50,j+50]:=image.Canvas.Pixels[x,y]; end; end; Form2.canvas.Draw(0,0,imagetemp); imagetemp.free; angle:=angle+5; end;
Je sais qu'on peut utiliser des librairies pour faire ce genre de trucs, mais je voulais savoir si c'était pas possible d'améliorer mon truc pour que ça fonctionne ?
Merci.
Partager