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

Lazarus Pascal Discussion :

Problème de rotation d'image [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre actif
    Avatar de sematimo
    Profil pro
    Inscrit en
    Février 2009
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 287
    Points : 276
    Points
    276
    Par défaut Problème de rotation d'image
    Bonjour à tous
    J'essaie de faire pivoter une image de 90°.
    Je me suis inspiré d'un bout de code ( https://www.developpez.net/forums/d1...calees-d-1-px/ )

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    unit Unit1;
    {$mode objfpc}{$H+}
    interface
    uses
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
      BGRABitmap, BGRABitmapTypes;
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure dessin();
      private
        procedure RotateImage(src, dest: TBGRABitmap; rot: Integer);
      public
      end;
     
    var
      Form1: TForm1;
     
    implementation
    {$R *.lfm}
    procedure TForm1.dessin();
    var
      iSrc, iDest: TBGRABitmap;
    begin
       iSrc := TBGRABitmap.Create('d:\a.png');  //image qui fait 800*600
      try
        iDest := TBGRABitmap.Create(iSrc.Height, iSrc.Width);   //image destination pour rotation 90°
     
        try
          // rotations et dessin sur le canevas final
     
          RotateImage(iSrc, iDest, 90);    // rotation 90°
         iDest.Draw(Canvas, 100, 10);
            idest.SaveToFile('d:\new_a.png');
     
        finally
          iDest.Free;
        end;
      finally
        iSrc.Free;
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     dessin;
    end;
     
    procedure TForm1.RotateImage(src, dest: TBGRABitmap; rot: Integer);
    // rotation d'une image : 1 = 0 / 2 = 90 / 3 = 180 / 4 = 270
    var
      Tmp: TBGRABitmap;
    begin
      Tmp := TBGRABitmap.Create(Src.Width,Src.Height, BGRAblack);
      try
        tmp.PutImageAngle(src.Width/2,
                        src.Height/2,
                        src,
                        rot,
                        tmp.Width/2,
                        tmp.Height/2);
        tmp.Draw(dest.Canvas, 0, 0);
      finally
        Tmp.Free;
      end;
    end;
     
    end.
    Mon image faire bien une rotation de 90 ° mais elle est coupée.
    Mon image de départ fait 800*600 pixels et à la sortie j'ai une image de 600*800 pixels mais tronquée.

    Nom : a.png
Affichages : 113
Taille : 1,22 Mo

    Nom : new_a.png
Affichages : 104
Taille : 815,1 Ko

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 695
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 695
    Points : 13 133
    Points
    13 133
    Par défaut
    On voit clairement que l'image subit une rotation par le centre sur un support qui fait toujours la taille originale de 800x600, TopLeft passe à X=100, Y=-100.

    Les dimensions de Tmp devraient plutôt être égales à Dest ; mais on peut se demander si cette image intermédiaire est vraiment nécessaire puisque Dest est finalement identique à Tmp (enfin est censée être identique).

  3. #3
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 421
    Points : 5 820
    Points
    5 820
    Par défaut
    Salut

    L'image est clairement tronquée aux deux extrémités.


    PS : L'image de destination doit etre un carré. Les côtés sont de la valeur de la diagonale de l'image source.
    Exemple pour une image de 800x600 : ton image de destination doit avoir des côtés de 1000x1000 ; de cette manière il n'y aura pas de troncature.
    Et à la fin, si c'est un retournement à 90°, tu réduiras le canevas final.
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 695
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 695
    Points : 13 133
    Points
    13 133
    Par défaut
    On tiendrait compte de la diagonale pour des angles non multiples de 90 (ici on sait que les cotes sont juste inversées) mais on la pré-calculerait pour fixer une taille définitive à la destination.
    En partant d'une image plus grande, tu devras de toute façon la calculer mais en plus calculer des offsets

    L'image ici est tronquée sur les côtés suite à la rotation (sur 800 on en garde que 600) et sur le haut suite au Draw (image décalée soit 100 à 700 mais transposée de 0 à 600).

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Bonjour !

    Soit dit en passant, pour faire ce que vous voulez, il y a une méthode plus facile, avec la fonction RotateCW, qui fait tout le boulot sans rien demander.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      FImage1 := TBGRABitmap.Create('grafx2_banner.png');
      FImage2 := FImage1.RotateCW;
    Nom : demo.png
Affichages : 65
Taille : 15,6 Ko
    Fichiers attachés Fichiers attachés
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  6. #6
    Membre actif
    Avatar de sematimo
    Profil pro
    Inscrit en
    Février 2009
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 287
    Points : 276
    Points
    276
    Par défaut
    Salut
    J'ai modifié le code et celui-ci marche.
    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
    45
    46
    47
    48
    unit Unit1;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ComCtrls,
      ExtCtrls, BGRABitmap, BGRABitmapTypes;
     
    type
      { TForm1 }
     
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure rotation(rot: single);
      private
        { private declarations }
      public
        { public declarations }
        bmp: TBGRABitmap;
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
    procedure TForm1.rotation(rot: single);
    var
      bitmap: TBGRABitmap;
    begin
      bitmap := TBGRABitmap.Create(bmp.Height, bmp.Width);
      Bitmap.PutImageAngle(Bitmap.Width / 2 - 0.5, Bitmap.Height / 2 - 0.5, bmp,
        rot, bmp.Width / 2 - 0.5, bmp.Height / 2 - 0.5);
      bitmap.SaveToFile('test_rot.bmp');
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      bmp := TBGRABitmap.Create('test.bmp');
      rotation(90);
    end;
     
    end.
    FImage1.RotateCW proposé par Roland est le plus simple mais j'essaie de comprendre les différents codes que je teste.

    merci à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. rotation d'images
    Par philippe du web dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 02/05/2007, 16h01
  2. Rotation d'image dans un état
    Par Papapetch dans le forum IHM
    Réponses: 3
    Dernier message: 10/06/2006, 18h02
  3. Rotation d'image (matrice)
    Par AsmBoy dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 16/01/2006, 07h49
  4. Faire une rotation d'image
    Par sozie9372 dans le forum 2D
    Réponses: 6
    Dernier message: 30/11/2005, 22h40
  5. [Image]Rotation d'image
    Par psychomatt dans le forum 2D
    Réponses: 6
    Dernier message: 16/12/2004, 20h18

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