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

Composants VCL Delphi Discussion :

Affichage de l'image d'un fichier photo type .afphoto


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 464
    Par défaut Affichage de l'image d'un fichier photo type .afphoto
    Bonjour,
    J'aurais besoin d’afficher soit le thumbnail soit l'image d'un fichier de type '.afphoto' (créé par AffinityPhoto), qui est l'équivalent du format psd de phtotoshop.
    Je ne connait pas le format de ce fichier propriétaire. Si quelqu'un connait un outil ou le format je suis preneur.

    Par contre j'ai remarqué que l'explorateur de windows sait afficher la miniature. Peut-on récupérer cette image pour la mettre dans un Timage ou un TImage32 ?

    Merci

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 942
    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 942
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    Aurais-tu un fichier exemple ou deux, pour y jeter l’œil ?
    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 expérimenté
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 464
    Par défaut
    Je peux t'en envoyer un, mais par wetransfer car ils sont très gros (150 Mo) : plusieurs calques, non compressés ....
    Donne moi ton mail par message privé si tu veux bien.
    Merci

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 942
    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 942
    Billets dans le blog
    6
    Par défaut
    fait !
    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 !

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 942
    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 942
    Billets dans le blog
    6
    Par défaut
    Premier regard non concluant, à la recherche de marqueurs jpeg (ayant lu que les données EXIF étaient conservées quelque part dans ce format non documenté)...
    Mais cette lecture évoque le besoin d'une dll et celle-ci parle d'une vignette png dans le fichier.
    Peut-être la dll est-elle nécessaire pour enregistrer l'extension de fichier et fournir à Windows le moyen de l'extraire.
    Reste à chercher une éventuelle vignette png dans le fichier.
    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
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 942
    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 942
    Billets dans le blog
    6
    Par défaut
    Dans l'exemple transmis, il y a un seul png-header (la séquence hexa de 8 octets 89 50 4E 47 0D 0A 1A 0A) en position 157608879 en décimal, soit 09 64 EB AF en hexa.
    Peut-être que passer le stream du fichier ouvert à cette position à un TPngImage permet de l'ouvrir ?
    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 !

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 163
    Par défaut
    Salut,

    il faudrait explorer la piste de la dll, en utilisant l'outil pendant que ProcessExplorer analyse ce qui se passe, si le farfouillage dans les images ne donne rien.

  8. #8
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 942
    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 942
    Billets dans le blog
    6
    Par défaut
    La dll exporte 4 fonctions, dont RegisterServer qui doit enregistrer le type (thumbnail) de fichier afphoto et donner un CLSID qui j'imagine sera passé à sa fonction DllGetClassObject qui doit fournir l'objet COM chargé de renvoyer la vignette à la demande de l'API Windows, en tant que Thumbnail Handler, probablement.

    Il "suffit" donc de faire appel à ce mécanisme pour extraire la vignette à afficher dans son application sur un système où le logiciel est installé; sinon, en l'absence de cette librairie, il faut extraire le png à la fin du fichier, ce qui est "long" sans savoir où trouver l'offset vers son adresse.
    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 !

  9. #9
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 464
    Par défaut
    Merci Tourlourou pour ton exploration efficace.
    Il "suffit" donc de faire appel à ce mécanisme pour extraire la vignette à afficher
    Dans l'idée je comprend le process, mais le mettre en musique......
    Je vais déjà essayer de récupérer le PNG même si cela s'avère lent, c'est déjà quelque chose.

  10. #10
    Membre émérite
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Par défaut
    j'ai réussit à me procurer quelques images au format Affinity Photo
    et j'ai tenté une approche différente en utilisant, au passage, l'unité de Paul Toth pour charger plus facilement et sans lib externe.

    Le code est très simple et fonctionne assez rapidement :
    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
    unit UAFPhoto;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, ExtDlgs;
     
    type
      TForm2 = class(TForm)
        Image1: TImage;
        Button1: TButton;
        OpenPictureDialog1: TOpenPictureDialog;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form2             : TForm2;
     
    implementation
    uses AnsiStrings,
      // l'unité de Paul Toth
      // https://github.com/tothpaul/Delphi/tree/master/GDIPBitmap
      // https://www.developpez.net/forums/d1783447/environnements-developpement/delphi/contribuez/lire-fichiers-jpg-png-tif-quelques-lignes-code/
      Execute.GDIPBitmap;
     
    {$R *.dfm}
     
    const
      PngHeader         : array[0..7] of AnsiChar = (#137, #80, #78, #71, #13, #10, #26, #10);
    var
      SearchInBin       : AnsiString; // Fichier afphoto
     
    function afLoadPNGThumb(const aFileName: string; const aImage: TImage): Boolean;
    var
      Po                : Integer;
      Ms                : TMemoryStream;
    begin
      Result := False;
      if (not FileExists(aFileName)) or (not Assigned(aImage)) then
        Exit;
      MS := TMemoryStream.Create;
      with MS do
      try
        LoadFromFile(aFileName);
        Seek(0, soFromBeginning);
        SetLength(SearchInBin, Size);
        MoveMemory(PByte(SearchInBin), Memory, Size);
      //  Recherche d'une Image PNG dans un Fichier *.afphoto
        Po := PosEx(PngHeader, SearchInBin, 1);
        if Po <> 0 then
        begin
          MS.SetSize(Size - Po);
          MoveMemory(Memory, PByte(@SearchInBin[po]), Size);
          aImage.Picture.Bitmap.GDIPLoadFromStream(MS);
          Result := True;
        end;
      finally
        MS.Free;
      end;
    end;
     
    procedure TForm2.Button1Click(Sender: TObject);
    begin
      OpenPictureDialog1.Filter := 'Affinity Photo|*.afphoto';
      if OpenPictureDialog1.Execute then
        afLoadPNGThumb(OpenPictureDialog1.FileName, Image1);
    end;
     
    end.
    Cordialement,
    @+

  11. #11
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 464
    Par défaut
    Merci Cirec, je viens de tester ton exemple : parfait.
    Je vais tester comme l'a suggéré Tourlourou de balayer le stream en partant de la fin voir si on gagne du temps.

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/02/2012, 23h49
  2. Réponses: 5
    Dernier message: 21/10/2011, 13h40
  3. affichage d'image dans un fichier
    Par sky88 dans le forum VB.NET
    Réponses: 2
    Dernier message: 20/10/2009, 17h06
  4. Affichage images dans mon fichier .jar
    Par womannosky dans le forum AWT/Swing
    Réponses: 12
    Dernier message: 11/07/2008, 10h47
  5. Réponses: 1
    Dernier message: 30/06/2008, 13h54

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