Bonjour,
je souhaiterais lire la résolution en DPI X et Y d'un JPEG par ses EXIF avec Delphi 10.3 mais aucun des codes que j'ai trouvé ne fonctionne avec ma version de Delphi.
Merci de votre aide.
Bien cordialement
Bonjour,
je souhaiterais lire la résolution en DPI X et Y d'un JPEG par ses EXIF avec Delphi 10.3 mais aucun des codes que j'ai trouvé ne fonctionne avec ma version de Delphi.
Merci de votre aide.
Bien cordialement
J'utilise depuis plusieurs versions de Delphi, 7,10 et 11.3 actuellement le CCR Exif v1.5.0 que l'on trouve ici :
https://github.com/esmondb/ccr-exif/tree/master
Par contre je n'ai jamais vu DPI X et Y dans les Exif des photos. Le seul cas ou cela aurait un sens et une utilité c'est pour un fichier issu d'un scanner, mais je pense que les DPI sont normalisés sur les 2 axes.
Cette information est indispensable venant de l'imprimante pour pouvoir imprimer les images correctement, mais cela n'a rien à voir avec les Exif.
finalement je vais laisser tomber les DPI X et les DPI Y
Bonjour
j'ai trouvé ça sur le web
http://sylvain.fish.free.fr/JPEG_SIZ..._jpeg_size.htm
Si on veut connaître la résolution d'une image, on peut charger l'image en question dans un objet Delphi qui le permet et obtenir par ce biais, le nombre de pixels en X et Y.
Quand aux DPI:
Le DPI est le nombre de pixels distincts que l'on peut représenter (imprimer ou afficher) sur une ligne de 2,54cm, soit la largeur d'un pouce (inch) dans le système métrique anglais.
Cela ne dépend donc pas simplement de l'image mais des capacités de représentation de l'image via un média (écran, imprimante, scanner, etc...)
ce n'est pas la taille de l'image que je veux connaître, ça c'est facile, c'est la résolution en DPI (nombre de pixels par pouces) qui est normalement dans les EXIF (regardez dans clic droit/propriétés/détails) sur une image JPEG scannée
Mais l'installation du paquet que l'on m'a donné me semble trop compliqué pour moi et c'est un détail pour mon programme, l'utilisateur pouvant la rentrer manuellement donc je laisse tomber, désolé de vous avoir dérangé pour rien
Bonjour,
La norme TIFF/EP nous dit :
Les Tags concernés sont $011A et $011B pour les résolutions X et Y, et $920E, $920F, et $9210 pour celles du capteur (X, Y, unité).Envoyé par 4.2 Image data
[EDIT] Et pour les lire, j'ai une unité pas finalisée (D5, portée/étendue incomplètement Lazarus puis réadaptée D11.3 en l'état) que je joins et qui s'utilise comme suit :
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 procedure TForm1.Button1Click(Sender: TObject); var S: string; ExifDecoder: TlyExifDecoder; Erreur: integer; begin OpenPictureDialog1.Filter := '*.*'; if OpenPictureDialog1.Execute() then begin S := OpenPictureDialog1.FileName; ExifDecoder := TlyExifDecoder.Create; if ExifDecoder.LoadFromFile(S, Erreur) then begin if ExifDecoder.HasExif then begin ShowMessage(ExifDecoder.TagToStr($011A)); end else ShowMessage('Pas de données EXIF'); end else ShowMessage('Erreur ' + Erreur.ToString); ExifDecoder.Free; end; end;
tu parles de la norme TIFF mais moi ce sont des JPEG !
Les Exif sont pour les JPEG, les TIFF et même pour les RAW.
intéressant, j'ai testé ton unité mais j'ai l'erreur -2 avec mon fichier JPEG
mon fichier est celui-ci : https://www.sylvain-ard.fr/temp/img.jpeg
je mets un lien car ça refuse de la joindre
ah si pardon je m'étais trompé de chemin mais maintenant ça me sort "pas de donnée EXIF"
EDIT après avoir lu les EXIF sur un lecteur en ligne, je m'aperçois que mon image n'en a pas ! pourtant quand on fait clic droit/propriétés/détails on voit la résolution, est-ce que c'est dans les IPTC ?
EDIT dans PhotoShop en faisant Fichier/Informations/Données brutes j'ai ça :
donc j'ai bien tiff:XResolution et tiff:YResolution, ce sont les IPTC ? comment lit-on ces informations et comme c'est du XML je suppose qu'il faut parser le XML aussi ?
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 <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 9.1-c002 79.dba3da3, 2023/12/13-05:06:49 "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/" xmlns:tiff="http://ns.adobe.com/tiff/1.0/" xmlns:exif="http://ns.adobe.com/exif/1.0/" xmlns:xmp="http://ns.adobe.com/xap/1.0/"> <xmpMM:DocumentID>0C402F327D44A458D92A8622BEB2E28C</xmpMM:DocumentID> <xmpMM:InstanceID>0C402F327D44A458D92A8622BEB2E28C</xmpMM:InstanceID> <dc:format>image/jpeg</dc:format> <photoshop:ColorMode>3</photoshop:ColorMode> <tiff:ImageWidth>4159</tiff:ImageWidth> <tiff:ImageLength>5948</tiff:ImageLength> <tiff:BitsPerSample> <rdf:Seq> <rdf:li>8</rdf:li> <rdf:li>8</rdf:li> <rdf:li>8</rdf:li> </rdf:Seq> </tiff:BitsPerSample> <tiff:PhotometricInterpretation>2</tiff:PhotometricInterpretation> <tiff:SamplesPerPixel>3</tiff:SamplesPerPixel> <tiff:XResolution>349/1</tiff:XResolution> <tiff:YResolution>349/1</tiff:YResolution> <tiff:ResolutionUnit>2</tiff:ResolutionUnit> <exif:ExifVersion>0231</exif:ExifVersion> <exif:ColorSpace>65535</exif:ColorSpace> <exif:PixelXDimension>4159</exif:PixelXDimension> <exif:PixelYDimension>5948</exif:PixelYDimension> <xmp:CreateDate>2024-03-24T19:57:35+01:00</xmp:CreateDate> <xmp:ModifyDate>2024-03-24T19:57:40+01:00</xmp:ModifyDate> <xmp:MetadataDate>2024-03-24T19:57:40+01:00</xmp:MetadataDate> </rdf:Description> </rdf:RDF> </x:xmpmeta>
sur une autre image scannée avec un scanner en 600 DPI pareil pas d'EXIF mais ceci dans les données brutes de PhotoShop :
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 <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 9.1-c002 79.dba3da3, 2023/12/13-05:06:49 "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/" xmlns:tiff="http://ns.adobe.com/tiff/1.0/" xmlns:exif="http://ns.adobe.com/exif/1.0/" xmlns:xmp="http://ns.adobe.com/xap/1.0/"> <xmpMM:DocumentID>5631E893FD99A836B472B75366E1F16C</xmpMM:DocumentID> <xmpMM:InstanceID>5631E893FD99A836B472B75366E1F16C</xmpMM:InstanceID> <dc:format>image/jpeg</dc:format> <photoshop:ColorMode>3</photoshop:ColorMode> <tiff:ImageWidth>4962</tiff:ImageWidth> <tiff:ImageLength>7019</tiff:ImageLength> <tiff:BitsPerSample> <rdf:Seq> <rdf:li>8</rdf:li> <rdf:li>8</rdf:li> <rdf:li>8</rdf:li> </rdf:Seq> </tiff:BitsPerSample> <tiff:PhotometricInterpretation>2</tiff:PhotometricInterpretation> <tiff:SamplesPerPixel>3</tiff:SamplesPerPixel> <tiff:XResolution>600/1</tiff:XResolution> <tiff:YResolution>600/1</tiff:YResolution> <tiff:ResolutionUnit>2</tiff:ResolutionUnit> <exif:ExifVersion>0231</exif:ExifVersion> <exif:ColorSpace>65535</exif:ColorSpace> <exif:PixelXDimension>4962</exif:PixelXDimension> <exif:PixelYDimension>7019</exif:PixelYDimension> <xmp:CreateDate>2024-03-22T16:38:34+01:00</xmp:CreateDate> <xmp:ModifyDate>2024-03-12T11:34:06+01:00</xmp:ModifyDate> <xmp:MetadataDate>2024-03-12T11:34:06+01:00</xmp:MetadataDate> </rdf:Description> </rdf:RDF> </x:xmpmeta>
Bonsoir,
Pour la Ronce de Mougeot, le jpg est au format JFIF (tu peux trouver une explication du format dans la dernière page de mon tuto).
Il démarre bien avec un marqueur application APP0 qui donne juste (16 octets) la résolution de l'image et l'absence de vignette, puis un marqueur APP2 (je ne suis pas allé plus loin).
Le décodage du marqueur APP0 fournit la résolution de 349x349 ppi.
j'ai trouvé cet utilitaire en ligne de commande que je pourrais lancer depuis Delphi : https://exiftool.org/ mais je ne trouve pas les paramètres à lui passer pour retrouver mes infos
je n'ai pas accès à phidels.com mon antivirus le bloque et quand je veux quand même y accéder j'ai une page blanche, si je comprend bien APP0 est dans les EXIF ? car exiftool me trouve aucun IPTC dans l'image, décidément c'est compliqué ces métadonnées !
comment extraire le APP0 avec ton unité STP ?
finalement avec l'aide de chatGPT 4 j'ai réussi à extraire la résolution de l'APP0 avec ce code, chatGPT 3.5 avait complètement échoué :
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 function getDPIJFIF(const NomFichier: string):integer; var FichierJPEG: TFileStream; MarqueurSOI, MarqueurAPP0, LongueurSegment: Word; Identifiant: array[0..4] of AnsiChar; Version: array[0..1] of Byte; Unites: Byte; XDensity, YDensity: Word; // Ajustement pour la lecture sur 2 octets ThumbnailWidth, ThumbnailHeight: Byte; begin FichierJPEG := TFileStream.Create(NomFichier, fmOpenRead or fmShareDenyWrite); try FichierJPEG.Read(MarqueurSOI, SizeOf(MarqueurSOI)); MarqueurSOI := Swap(MarqueurSOI); if MarqueurSOI = $FFD8 then // Vérifie le marqueur SOI begin FichierJPEG.Read(MarqueurAPP0, SizeOf(MarqueurAPP0)); MarqueurAPP0 := Swap(MarqueurAPP0); if MarqueurAPP0 = $FFE0 then // Marqueur APP0 begin FichierJPEG.Read(LongueurSegment, SizeOf(LongueurSegment)); LongueurSegment := Swap(LongueurSegment); FichierJPEG.Read(Identifiant, SizeOf(Identifiant)); // Lire l'identifiant "JFIF\0" FichierJPEG.Read(Version, SizeOf(Version)); // Lire la version FichierJPEG.Read(Unites, SizeOf(Unites)); // Lire les unités FichierJPEG.Read(XDensity, SizeOf(XDensity)); XDensity := Swap(XDensity); // Ajustement pour la lecture FichierJPEG.Read(YDensity, SizeOf(YDensity)); YDensity := Swap(YDensity); // Ajustement pour la lecture FichierJPEG.Read(ThumbnailWidth, SizeOf(ThumbnailWidth)); // Lire la largeur de la vignette FichierJPEG.Read(ThumbnailHeight, SizeOf(ThumbnailHeight)); // Lire la hauteur de la vignette case Unites of 0:result:=300;//fallback 1:result:=XDensity;//DPI 2:result:= round(XDensity*2.54);//cm end; // Traitement des données extraites ici end else begin result:=300; // Le fichier ne commence pas par un segment APP0 valide end; end else begin result:=300; // Le fichier n'est pas un JPEG valide end; finally FichierJPEG.Free; end; end;
Bonjour,
C'est normal, il est question de JFIF ! Dans ton fichier il y a ça (entre autres) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 [JFIF] JFIFVersion : 1.01 [JFIF] ResolutionUnit : inches [JFIF] XResolution : 349 [JFIF] YResolution : 349
Bonjour,
Ci-dessous le pdf sur les EXIF qui présente la structure des JFIF en dernière page.
Pour le décodage du segment en question, la procédure était restée en ToDo, comme beaucoup du reste Mais c'est trivial si on en connaît la structure.
merci, comme dit dans un message plus haut c'est résolu
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager