IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

Blog de Gilles Vasseur - Pascal et compagnie

Les transitions entre images sous Lazarus avec BGRABitmap (XIII) - Les contractions de rectangles

Noter ce billet
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 :

Nom : blefttopshrink.png
Affichages : 147
Taille : 292,1 Ko

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);

Nom : brighttopshrink.png
Affichages : 151
Taille : 277,4 Ko

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);

Nom : bleftbuttonshrink.png
Affichages : 157
Taille : 263,4 Ko

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);

Nom : brightbottomshrink.png
Affichages : 159
Taille : 283,0 Ko

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 !

Envoyer le billet « Les transitions entre images sous Lazarus avec BGRABitmap (XIII) - Les contractions de rectangles » dans le blog Viadeo Envoyer le billet « Les transitions entre images sous Lazarus avec BGRABitmap (XIII) - Les contractions de rectangles » dans le blog Twitter Envoyer le billet « Les transitions entre images sous Lazarus avec BGRABitmap (XIII) - Les contractions de rectangles » dans le blog Google Envoyer le billet « Les transitions entre images sous Lazarus avec BGRABitmap (XIII) - Les contractions de rectangles » dans le blog Facebook Envoyer le billet « Les transitions entre images sous Lazarus avec BGRABitmap (XIII) - Les contractions de rectangles » dans le blog Digg Envoyer le billet « Les transitions entre images sous Lazarus avec BGRABitmap (XIII) - Les contractions de rectangles » dans le blog Delicious Envoyer le billet « Les transitions entre images sous Lazarus avec BGRABitmap (XIII) - Les contractions de rectangles » dans le blog MySpace Envoyer le billet « Les transitions entre images sous Lazarus avec BGRABitmap (XIII) - Les contractions de rectangles » dans le blog Yahoo

Commentaires