Les transitions entre images sous Lazarus avec BGRABitmap (XIII) - Les contractions de rectangles
par
, 06/04/2018 à 07h54 (793 Affichages)
Nous passerons rapidement sur la présentation des contractions puisqu'elles forment un ensemble de transitions inverses de celles qui ont été étudiées dans le billet sur les expansions. Cette fois-ci, c'est l'image d'origine qui disparaîtra peu à peu dans un rectangle de plus en plus petit.
Les contractions de rectangles
Une seule de ces transitions sera un peu plus détaillée : LeftTopShrink. Même si, comme nous l'avons déjà vu, il ne s'agit qu'une des possibilités, le code du gestionnaire OnClick intervertira les images d'origine et de destination puisque c'est la première qui devra être affectée par la contraction. De même, les calculs inverseront la progression de l'étape fournie par fStep en utilisant une soustraction qui fixera à 100 le point de départ.
Au final, voici la méthode OnClick modifiée :
Code pascal : 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 procedure TMainForm.btnGoClick(Sender: TObject); // *** dessin *** var LBGRAFrom, LBGRATo, LBGRAMask: TBGRABitmap; LY, LX: Integer; begin btnGo.Enabled := False; LBGRAFrom := TBGRABitmap.Create(imgResult.ClientWidth, imgResult.ClientHeight, BGRABlack); try LBGRATo := TBGRABitmap.Create(imgResult.ClientWidth, imgResult.ClientHeight, BGRABlack); try LBGRAMask := TBGRABitmap.Create(imgResult.ClientWidth, ClientHeight, BGRABlack); try fStep := 0; repeat Inc(fStep); // traitement 1 ici (source) LX := 0; LY := 0; LBGRAFrom.FillRect(ClientRect, BGRABlack); LBGRAFrom.PutImage(LX, LY, fBGRATo, dmDrawWithTransparency, Opacity(False)); // traitement 2 ici (destination)... LBGRAMask.FillRectAntialias(0, 0, imgResult.ClientWidth, imgResult.ClientHeight, BGRABlack); LBGRAMask.FillRectAntialias(0, 0, imgResult.ClientWidth * (100 - fStep) div 100, imgResult.ClientHeight * (100 - fStep) div 100, BGRAWhite); LBGRATo.PutImage(0, 0, fBGRAFrom, dmSet); LBGRATo.ApplyMask(LBGRAMask); LBGRAFrom.PutImage(0, 0, LBGRATo, dmDrawWithTransparency, Opacity); LBGRAFrom.Draw(imgResult.Canvas, 0, 0, False); imgResult.Repaint; sleep(100 - fSpeed); until fStep = 100; finally LBGRAMask.Free; end; finally LBGRATo.Free; end; finally LBGRAFrom.Free; btnGo.Enabled := True; end; end;
L'application de test en action affichera par exemple :
Pour parvenir à leurs fins, les transitions de la même famille ne modifieront que la ligne de calcul du masque.
Ainsi, la transition RightTopShrink sera implémentée de cette façon :
Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 LBGRAMask.FillRectAntialias(imgResult.ClientWidth, 0, imgResult.ClientWidth * fStep div 100, imgResult.ClientHeight * (100 - fStep) div 100, BGRAWhite);
La transition LeftBottomShrink aura quant à elle cette forme :
Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 LBGRAMask.FillRectAntialias(0, imgResult.ClientHeight, imgResult.ClientWidth * (100 - fStep) div 100, imgResult.ClientHeight * fStep div 100, BGRAWhite);
Enfin, la transition RightBottomShrink fermera la marche avec ce code :
Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 LBGRAMask.FillRectAntialias(imgResult.ClientWidth, imgResult.ClientHeight, imgResult.ClientWidth * fStep div 100, imgResult.ClientHeight * fStep div 100, BGRAWhite);
Le principe des variantes est toujours le même : à partir d'une formule, nous déclinons les possibilités en jouant sur les coordonnées ou les tailles.
Notez que notre travail sur l'opacité a été payant : nous n'avons jamais à modifier quoi que ce soit pour obtenir des superpositions par transparence !
J'espère que toutes ces exemples, assez répétitifs il faut l'avouer, vous auront éclairé sur les techniques employées. Dans le prochain billet, nous verrons encore une série aussi facile puis nous quitterons le riche domaine des rectangles pour aborder des formes plus complexes !