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 :

Opérations sur des images


Sujet :

Delphi

  1. #1
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2017
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2017
    Messages : 344
    Par défaut Opérations sur des images
    Bonjour,
    je voudrais pouvoir effectuer des rotations de 90,180,270 degrés sur des images JPEG ainsi que des flips (effet miroir) verticaux et horizontaux, attention pas touche aux informations EXIF, je veux que le tableau de pixels à l'intérieur soit bien modifié.
    Merci
    Bien cordialement.

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 569
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    FMX fourni toute une gamme d'effets pour changer les images, mais sauvegarder le résultat supprimera les EXIFs.
    Je ne sais pas si une modification de l'image n'oblige pas à modifier certaines parties de L'EXIF (largeur et hauteur d'image en cas de rotation par exemple)

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 001
    Par défaut
    Windows GDI - Bitmap Rotation

    As-tu essayé les fonctions intégrées à l'OS comme SetWorldTransform et son XFORM structure comme dans le sujet Rotation d'image avec bitblt/xform ou le sujet [débutant] Traitement d'image: WMF ou bmp?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2003
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2003
    Messages : 169
    Par défaut
    bonjour

    pour la partie exif regardez l'unité dexif ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ImgData: TImgData;
     
    ImgData.ProcessFile( nomfichiersource );
    // traitement de l'image dans la variable jpg
    imgdata.WriteEXIFJpeg(jpg, nomfichierDestination);

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 910
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    Quelles informations EXIF doivent être conservées ? Pour être assuré de toutes les conserver valides, ça peut être un challenge !
    Il peut d'ailleurs y avoir un marqueur orientation, qu'il faudra fatalement modifier (mais la norme ISO 12234-2 Image data format — TIFF/EP dit du tag $112 : "Note that the TIFF values which correspond to “mirrored” image orientations are not allowed.").
    Certaines peuvent pointer des zones de l'image (tables de quantification ou Hufman), et il faut être sûr que l'enregistrement les modifiera si besoin.
    S'il y a un répertoire fabricant parmi les informations, certaines des informations sont bien au format EXIF, mais souvent avec un format ou des tags propriétaires à la signification spécifique. Il faut donc pouvoir les reconstituer si on met la panique dedans.
    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 !

  6. #6
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2017
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2017
    Messages : 344
    Par défaut
    Bonjour,
    je ne peut pas consulter phidels.com mon antivirus me le bloque avec "alerte trojan".
    Pour les informations EXIF évidemment qu'on a le droit de modifier les informations de largeur et hauteur, je voulais dire ne pas modifier les informations dites de rotation. L'image n'est pas censée en contenir au départ.
    Je pense qu'il faut en passer par convertir notre TJPEGImage en TBitmap, le tourner puis le reconvertir en TJPEGImage, je pense que Delphi écrira correctement les EXIF de base dedans, je n'ai pas besoin des EXIF constructeur.
    Ma question devient donc comment tourner ou flipper un TBitmap. Il faut que l'opération soit rapide donc je voudrais utiliser des fonctions préfabriquées de Delphi ou de Windows car hors de question de le faire pixel par pixel.
    Merci de votre aide
    Bien cordialement

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 569
    Billets dans le blog
    65
    Par défaut
    Il faut que l'opération soit rapide donc je voudrais utiliser des fonctions préfabriquées de Delphi ou de Windows car hors de question de le faire pixel par pixel.
    Alors, voici un essai avec GDI,

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    unit Unit16;
     
    interface
     
      uses
        Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
        System.Classes, Vcl.Graphics,
        Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtDlgs,
        Vcl.ExtCtrls,
        Vcl.Imaging.jpeg;
     
      type
        TForm16 = class(TForm)
          Button1: TButton;
          Image1: TImage;
          OpenPictureDialog1: TOpenPictureDialog;
          procedure Button1Click(Sender: TObject);
        private
          { Déclarations privées }
        public
          { Déclarations publiques }
        end;
     
      var
        Form16: TForm16;
     
    implementation
     
    {$R *.dfm}
     
      uses Winapi.GDIPApi, Winapi.GDIPObj, Winapi.GDIPUTIL;
     
      procedure TForm16.Button1Click(Sender: TObject);
      var
        GPImage: TGPImage;
        GPGraphics: TGPGraphics;
        pPropItem: PPropertyItem;
        BufferSize: Cardinal;
        Orientation: Byte;
        RotateType: TRotateFlipType;
        Bitmap: TBitmap;
      begin
        if OpenPictureDialog1.Execute then
        begin
          GPImage := TGPImage.Create(OpenPictureDialog1.FileName);
          try
            // extraction EXIF 
            // BufferSize := GPImage.GetPropertyItemSize(PropertyTagOrientation);  
            // if BufferSize > 0 then
            // begin
            // GetMem(pPropItem, BufferSize);
            // try
            // GPImage.GetPropertyItem(PropertyTagOrientation, BufferSize, pPropItem);
            // Orientation := PByte(pPropItem.value)^;
            // case Orientation of
            // 1: RotateType := RotateNoneFlipNone; // Horizontal - pas de rotation
            // 2: RotateType := RotateNoneFlipX;
            // 3: RotateType := Rotate180FlipNone;
            // 4: RotateType := Rotate180FlipX;
            // 5: RotateType := Rotate90FlipX;
            // 6: RotateType := Rotate90FlipNone;
            // 7: RotateType := Rotate270FlipX;
            // 8: RotateType := Rotate270FlipNone;
            // else
            // RotateType := RotateNoneFlipNone
            // end;
    //      finally
    //        FreeMem(pPropItem);
    //      end;
            RotateType := Rotate180FlipNone; // un choix de ma part
     //       if RotateType <> RotateNoneFlipNone then
              GPImage.RotateFlip(RotateType);
            Bitmap := TBitmap.Create;
            try
              Bitmap.Width := GPImage.GetWidth;
              Bitmap.Height := GPImage.GetHeight;
              Bitmap.Canvas.Lock;
              try
                GPGraphics := TGPGraphics.Create(Bitmap.Canvas.Handle);
                try
                  GPGraphics.DrawImage(GPImage, 0, 0, GPImage.GetWidth,
                    GPImage.GetHeight);
                  Image1.Picture.Assign(Bitmap);
                finally
                  GPGraphics.Free;
                end;
              finally
                Bitmap.Canvas.Unlock;
              end;
            finally
              Bitmap.Free;
            end;
     
          // end;
        finally
          GPImage.Free
        end;
      end;
    end;
    Nom : Capture.PNG
Affichages : 193
Taille : 317,2 Ko

    et avec RotateNoneFlipX
    Nom : Capture.PNG
Affichages : 181
Taille : 795,1 Ko

  8. #8
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2017
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2017
    Messages : 344
    Par défaut
    OK merci beaucoup mais on a le choix entre FlipNone et FlipX quid du flip vertical ou horizontal ?

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 910
    Billets dans le blog
    6
    Par défaut
    Au pire, un flip vertical n'est-il pas la combinaison d'une rotation à 90°, d'un flip horizontal et d'une rotation à -90°?
    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 !

  10. #10
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2017
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2017
    Messages : 344
    Par défaut
    si mais en fait ce que je voudrais c'est une fonction qui prend deux paramètres :
    1 : l'angle de rotation 0,90,180,270, d'ailleurs dans la fonction c'est horaire ou antihoraire ?
    2 : le flip (none, vertical, horizontal)

    donc il y a une série de if à faire !

  11. #11
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2017
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2017
    Messages : 344
    Par défaut
    d'ailleurs il faut définir l'ordre on va choisir arbitrairement rotation puis flip, sinon je peux aussi me suffire de cette fonction

    en fait je veux faire ces opérations pour augmenter la base d'apprentissage pour mon logiciel de labélisation pour deep learning, mais si j'ai déjà la rotation plus un flip (on sait pas lequel) c'est déjà très bien

  12. #12
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2017
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2017
    Messages : 344
    Par défaut
    finalement j'accepte la réponse de SergioMaster j'ai réussi à faire ce que je voulais avec ça de plus je vous fournis ici ma fonction de transformation de coordonnées ça pourra toujours servir à qqn :

    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
    //transforme le point "point" sur l'image de départ en un point sur l'image d'arrivée après transformation, la largeur et la hauteur en paramètre de la fonction sont ceux de l'image de départ
    function  transformePoint(point:tpoint;transformation:integer;largeur:integer;hauteur:integer):tpoint;
    begin
       case transformation of
      1: begin
      //RotateNoneFlipNone
      result.X:=point.x;
      result.Y:=point.y;
      end;
      2: begin
       //RotateNoneFlipX;
      result.X:=largeur-point.X-1;
      result.Y:=point.y;
      end;
     
      3: begin
      //Rotate180FlipNone;
      result.X:=largeur-point.X-1;
      result.Y:=hauteur-1-point.y;
      end;
     
      4: begin
      // Rotate180FlipX;
      result.X:=point.X;
      result.Y:=hauteur-1-point.y;
      end;
     
      5: begin
      //Rotate90FlipX;
      result.X:=point.y;
      result.Y:=point.x;
      end;
     
      6: begin
      // Rotate90FlipNone;
      result.X:=hauteur-1-point.y;
      result.Y:=point.x;
      end;
     
      7: begin
      // Rotate270FlipX;
      result.X:=hauteur-1-point.y;
      result.Y:=largeur-1-point.x;
      end;
     
      8: begin
      // Rotate270FlipNone;
      result.X:=point.y;
      result.Y:=largeur-1-point.x;
      end
    else
       begin
      //RotateNoneFlipNone
      result.X:=point.x;
      result.Y:=point.y;
      end;
    end;
    end;

  13. #13
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 569
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par Sylvain255 Voir le message
    OK merci beaucoup mais on a le choix entre FlipNone et FlipX quid du flip vertical ou horizontal ?
    il suffit de regarder dans les sources de l'unité GDIAPI pour trouver l'ensemble des rotations (lignes 3310 -3330)

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

Discussions similaires

  1. Problèmes de droits sur des images
    Par bedford dans le forum Sécurité
    Réponses: 2
    Dernier message: 11/08/2006, 09h26
  2. Script sur des images
    Par philippe du web dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 07/06/2006, 22h50
  3. Histogramme sur des images 32 bits
    Par xxiemeciel dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 27/01/2006, 14h17
  4. Opération sur des heures dans Excel
    Par mirascheat dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/12/2005, 10h34
  5. Débutant travailler sur des images
    Par doud dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 15/08/2005, 15h47

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