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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de sematimo
    Profil pro
    Inscrit en
    Février 2009
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 332
    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 : 201
Taille : 1,22 Mo

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

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 929
    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 489
    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 489
    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.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 929
    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 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 160
    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 : 148
Taille : 15,6 Ko
    Fichiers attachés Fichiers attachés

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

    Informations forums :
    Inscription : Février 2009
    Messages : 332
    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