Bonsoir,
Je souhaite pouvoir effectuer tout à la fois un zoom, une rotation ou encore une transparence sur un graphique contenu dans un BGRABitmap.
Le problème est que je ne parviens pas à associer les trois effets simultanément.
Je suis parti du code suivant, inspiré d'une démo trouvé sur le forum anglais :
Où bmp est le graphique d'origine (taille: 1920x1080px) modifié et affiché dans Bitmap (taille: 856x624px).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 procedure TfrmMap.bgraMainRedraw(Sender: TObject; Bitmap: TBGRABitmap); begin Bitmap.PutImageAngle(Bitmap.Width/2-0.5, Bitmap.Height/2-0.5, bmp, tbAngle.Position, bmp.Width/2-0.5, bmp.Height/2-0.5, tbOpacity.Position); end;
Le code ci-dessus effectue superbement une rotation avec transparence en prenant le centre de Bitmap comme axe de rotation.
Mais je n'ai pas trouvé une procédure ou fonction qui permette en même temps de zoomer le graphique d'origine.
Aussi j'ai modifié le code de la manière suivante :
Et là j'avais les trois effets (transparence, rotation et zoom) réunis ! Le hic toutefois, c'est que la rotation ne s'effectue plus à partir 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 procedure TfrmMap.bgraMainRedraw(Sender: TObject; Bitmap: TBGRABitmap); var affine: TBGRAAffineBitmapTransform; LBGRATemp: TBGRABitmap; begin LBGRATemp := TBGRABitmap.Create(bgraMain.ClientWidth, bgraMain.ClientHeight, BGRABlack); try affine := TBGRAAffineBitmapTransform.Create(bmp, false); affine.GlobalOpacity := tbOpacity.Position; affine.RotateDeg(tbAngle.Position); affine.Scale(tbZoom.Position / 100); affine.Translate(bgraMain.ClientWidth / 2, bgraMain.ClientHeight / 2); LBGRATemp.Fill(affine); Bitmap.PutImage(0, 0, LBGRATemp, dmSet, tbOpacity.Position); finally LBGRATemp.Free; affine.Free; end; end;!
Quelle procédure ou fonction dois-je ajouter à la variable affine pour parvenir à ce résultat ?
Merci d'avance pour votre aide.
Partager