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 :

Rotations d'images décalées d'1 px


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Rotations d'images décalées d'1 px
    Bonjour,

    Je cherche actuellement à afficher des images (de 20x20px) sur lesquelles j'applique des rotations. (de 90, 180 ou 270°)
    Cela fonctionne, mais ce n'est pas parfait, j'ai un décalage d'un pixel je pense dans certain cas.

    C'est le code ci-dessous que j'utilise et qui me pose problème.

    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
    procedure TRotImgs.FormShow(Sender: TObject);
    var
      iDroit, iDroite(*, iGauche*), iTmp: TBGRABitmap;
      chemin: String;
    begin
      // création des images
      fond := TBGRABitmap.Create(Panel1.Width, Panel1.Height, BGRAWhite);
     
      chemin  := Application.Location + 'imgs\';
      iDroit  := TBGRABitmap.Create(chemin + 'droit.png' );
      iDroite := TBGRABitmap.Create(chemin + 'droite.png');
      //iGauche := TBGRABitmap.Create(chemin + 'gauche.png');
      itmp    := TBGRABitmap.Create(20, 20, BGRA(0, 0, 0, 0));
     
      // chargement des images
      iDroite.Draw(fond.Canvas, 50, 50);
      TRotImgs.RotateImage(iDroit, iTmp, 2);
      iTmp.Draw(fond.Canvas, 50 + 20, 50);
     
      TRotImgs.RotateImage(iDroite, iTmp, 2);
      iTmp.Draw(fond.Canvas, 50 + 40, 50);
      TRotImgs.RotateImage(iDroit, iTmp, 3);
      iTmp.Draw(fond.Canvas, 50 + 40, 50 + 20);
     
      TRotImgs.RotateImage(iDroite, iTmp, 3);
      iTmp.Draw(fond.Canvas, 50 + 40, 50 + 40);
      TRotImgs.RotateImage(iDroit, iTmp, 4);
      iTmp.Draw(fond.Canvas, 50 + 20, 50 + 40);
     
      TRotImgs.RotateImage(iDroite, iTmp, 4);
      iTmp.Draw(fond.Canvas, 50, 50 + 40);
      iDroit.Draw(fond.Canvas, 50, 50 + 20);
     
      FreeAndNil(iDroit);
      FreeAndNil(iDroite);
      //FreeAndNil(iGauche);
      FreeAndNil(itmp);
    end;
     
    procedure TRotImgs.FormDestroy(Sender: TObject);
    begin
      FreeAndNil(fond);
    end;
     
    procedure TRotImgs.Panel1Paint(Sender: TObject);
    begin
      if (Assigned(fond)) then
        fond.Draw(Panel1.Canvas, 0, 0);
    end;
     
    class procedure TRotImgs.RotateImage(imgOrg, imgRot: TBGRABitmap; rot: Integer);
    // rotation d'une image : 2 = 90 / 3 = 180 / 4 = 270
    begin
      if (rot < 2) or (rot > 4) then Exit;
     
      imgRot.PutImageAngle(imgOrg.Width  div 2,
                           imgOrg.Height div 2,
                           imgOrg,
                           90 * (rot - 1),
                           imgRot.Width  div 2,
                           imgRot.Height div 2);
    end;
    Si des gens sont motivés, je peux mettre le projet à dispo.
    c'est juste un projet de tests.


    Savez-vous ce qui ne vas pas dans mon code, ou comment le corriger ?

  2. #2
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Salut , Benoit

    Citation Envoyé par benoit1024 Voir le message
    Bonjour,

    Je cherche actuellement à afficher des images (de 20x20px) sur lesquelles j'applique des rotations. (de 90, 180 ou 270°)
    Cela fonctionne, mais ce n'est pas parfait, j'ai un décalage d'un pixel je pense dans certain cas.
    Tu peux préciser les cas ?

    sinon au 1er coup d'oeil
    remplace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    imgRot.PutImageAngle(imgOrg.Width  div 2,
                           imgOrg.Height div 2,
                           imgOrg,
                           90 * (rot - 1),
                           imgRot.Width  div 2,
                           imgRot.Height div 2);
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var
      SrcCenterX, SrcCenterY : Integer;
     
    SrcCenterX:=(imgOrg.Width  div 2)-1;
    SrcCenterY:=(imgOrg.Height  div 2)-1;
    imgRot.PutImageAngle((SrcCenterX, SrcCenter,  imgOrg,
                           90 * (rot - 1),
                           SrcCenterX, SrcCenterY);
    Bon après je n'utilise pas assez BGRABitmap pour te le certifier. Mais pense que l’accès au pixels débutes à ZERO dans ton cas pour une image qui fais 20x20 tu accèdes aux pixels en x et y dans l’intervalle de 0 à 19 d'ou le -1

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je pense aussi que cela vient de ce problème.
    Les images qui paraissent décalées sont en faite cette qui n'ont pas de rotation.

    j'ai essayé de mettre -1 mais les écarts sont pires.
    J'ai essayé de mettre -0.5 mais cela ne change rien.

    La solution que j'ai trouvée est d'appliquer une rotation sur toutes les images, même celles déjà dans le bon sens mais avec un angle de 0.
    J'obtiens ainsi bien l'image que j'attendais.

    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
    procedure TRotImgs.FormShow(Sender: TObject);
    var
      iDroit, iDroite(*, iGauche*), iTmp: TBGRABitmap;
      chemin: String;
    begin
      // création des images
      fond := TBGRABitmap.Create(Panel1.Width, Panel1.Height, BGRAWhite);
     
      chemin  := Application.Location + 'imgs\';
      iDroit  := TBGRABitmap.Create(chemin + 'droit.png' );
      iDroite := TBGRABitmap.Create(chemin + 'droite.png');
      //iGauche := TBGRABitmap.Create(chemin + 'gauche.png');
     
     
      // dessin des images
      iTmp := TBGRABitmap.Create(60, 60, BGRA(255, 0, 0));
      iTmp.Draw(fond.Canvas, 50, 50);
     
      FreeAndNil(itmp);
      itmp    := TBGRABitmap.Create(20, 20, BGRA(0, 0, 0, 0));
     
      TRotImgs.RotateImage(iDroite, fond, iTmp, 1, 50, 50);
      TRotImgs.RotateImage(iDroit,  fond, iTmp, 2, 50 + 20, 50);
     
      TRotImgs.RotateImage(iDroite, fond, iTmp, 2, 50 + 40, 50);
      TRotImgs.RotateImage(iDroit,  fond, iTmp, 3, 50 + 40, 50 + 20);
     
      TRotImgs.RotateImage(iDroite, fond, iTmp, 3, 50 + 40, 50 + 40);
      TRotImgs.RotateImage(iDroit,  fond, iTmp, 4, 50 + 20, 50 + 40);
     
      TRotImgs.RotateImage(iDroite, fond, iTmp, 4, 50, 50 + 40);
      TRotImgs.RotateImage(iDroit,  fond, iTmp, 1, 50, 50 + 20);
     
      FreeAndNil(iDroit);
      FreeAndNil(iDroite);
      FreeAndNil(itmp);
    end;
     
    procedure TRotImgs.FormDestroy(Sender: TObject);
    begin
      FreeAndNil(fond);
    end;
     
    procedure TRotImgs.Panel1Paint(Sender: TObject);
    begin
      if (Assigned(fond)) then
        fond.Draw(Panel1.Canvas, 0, 0);
    end;
     
    class procedure TRotImgs.RotateImage(src, dest, tmp: TBGRABitmap; rot, posX, posY: Integer);
    // rotation d'une image : 1 = 0 / 2 = 90 / 3 = 180 / 4 = 270
    begin
      tmp.PutImageAngle(src.Width   div 2 - 0.5,
                        src.Height  div 2 - 0.5,
                        src,
                        90 * (rot - 1),
                        tmp.Width  div 2 - 0.5,
                        tmp.Height div 2 - 0.5);
      tmp.Draw(dest.Canvas, posX, posY);
    end;

  4. #4
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 133
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 133
    Par défaut
    Bonsoir,

    juste un mot :
    Citation Envoyé par benoit1024 Voir le message
    J'ai essayé de mettre -0.5 mais cela ne change rien.
    C'est normal, tu travailles avec des entiers, donc il y a des chances pour que ton src.Width div 2 - 0.5 soit converti silencieusement en src.Width div 2 - 0.
    Pas testé mais je sens bien ça comme ça.

  5. #5
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Resalut j'ai répondu vite cet après midi. Vérifies les dimensions de ton bitmap après rotation car regardes

    Nom : rect4513.png
Affichages : 357
Taille : 11,0 Ko
    en noir surface virtuelle
    rouge le dessin
    en bleu lla dimension de la nouvelle surface


    Donc soit BGRABitmap redimensionne ton bitmap soit tu te te retrouves avec une image tronquée.
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  6. #6
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 133
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 133
    Par défaut
    Salut,
    Citation Envoyé par BeanzMaster Voir le message
    Resalut j'ai répondu vite cet après midi. Vérifies les dimensions de ton bitmap après rotation car regardes

    Nom : rect4513.png
Affichages : 357
Taille : 11,0 Ko
    Euh, y a pas une erreur, là ? :

    Nom : rotation902.png
Affichages : 308
Taille : 3,4 Ko

    Moi je vois plutôt une rotation à 45 °,

    Et ce petit "c" au bout, il indique quoi ? Une température comme Celsius ? Je sais bien qu'il fait chaud en ce moment, mais quand même,

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