IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

[D7] Effet miroir d'un Bitmap


Sujet :

Delphi

  1. #1
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut [D7] Effet miroir d'un Bitmap
    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 :

    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;
    Avant j'utilisais directement des Scanlines sans pointeurs, mais c'était très lent.

    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       Dy[x]^:=P^;
       inc(Dy[x]);
       inc(P);
    Dy[x] et P n'ont pas même longueur ?
    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

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    Incrémenter un pointeur de 1 l'avance de la taille du type pointé, donc sur la donnée suivante pour un tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for y := sh downto 0 do
          begin
            P:=Src.ScanLine[y]; // balaye les lignes de la source du bas vers le haut
            for x := 0 to dH do // balaye les pixels de la ligne source de gauche à droite 
              begin
                Dy[x]^:=P^; // affecte le pixel de la colonne x de la source à la colonne pointée de la ligne x de la destination
                inc(Dy[x]); // pointera sur le pixel suivant de la destination
                inc(P); //  pointera sur le pixel suivant de la source 
              end;
          end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    A B C D
    E F G H
    I J K L
    donnera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    I E A
    J F B
    K G C
    L H D
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Merci Tourlourou pour tes explications très claires

    Je comprends maintenant.

    Sinon, pour mon flip Horizontal je vais faire un simple CopyRect, ce qui est simple et rapide

    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
    { ========================================================================== }
    procedure MirorH(Src, Dest: TBitmap);
    // Miroir horizontal rapide
    Var
      Im : TImage;
      X,Y : Integer;
      SrcRect,DstRect : TRect;
    Begin
      if Src.PixelFormat<>pf32bit then
        Src.PixelFormat := pf32bit;
      if Dest.PixelFormat<>pf32bit then
        Dest.PixelFormat := pf32bit;
      X := Src.Width;
      Y := Src.Height;
      SrcRect := Rect(0,0,X,Y);
      DstRect := Rect(X,0,0,Y);
      Dest.Width := X;
      Dest.Height := Y;
      Dest.Canvas.CopyRect(DstRect,Src.Canvas,SrcRect);
    End;
     
    { ========================================================================= }
    A+
    Charly

Discussions similaires

  1. [GD] Effet miroir avec gd
    Par Nious99 dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 27/02/2017, 22h37
  2. [Joomla!] Joom!fish Effet miroir vertical
    Par intissar_g dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 11/03/2009, 14h52
  3. [Débutant] Inverser une image (effet miroir)
    Par pedrosanchau dans le forum Images
    Réponses: 2
    Dernier message: 14/01/2009, 16h32
  4. [GD] message d'erreur pour un code d'effet miroir
    Par ranell dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 12/06/2007, 21h07
  5. [ImageMagick] Effet miroir sur une image
    Par drakan dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 22/11/2006, 11h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo