Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

EXIF (or other meta-data) data that Windows displays but PHP does not

Tags:

php

exif

I am working to pull some information from JPEGs supplied to my client by a photographer.

When examined under Windows all of the images contain data in a field called Tags:

enter image description here

enter image description here

To do some testing first I made the following script and am iterating over entries in the binary file headers using the code below.

Sometimes I get values for ImageDescription. Often text in Copyright and Author but the Tags content never ever shows up here and it is the capture of that content the client most wants to automate.

Can anyone advise me as to how I can access the Tags field content?

Uploaded copy of file is here.

UPDATE - changed IDF0 to ANY_TAG and added 3rd arg true to exif_read_data() per Tiger-222's response. Also added print_r output at end of post

UPDATE 2 Added requested error_display() and ini_set() calls and also tried exif_read_data() 2nd arg of 0 in place of 'ANY_TAG' per https://php.net/manual/en/function.exif-read-data.php

<?php
    ini_set('display_errors', 1);
    ini_set('exif.encode_unicode', 'UTF-8');  // To see WINXP values
    error_reporting(-1);        
    $n = (intval($_GET['n'])) ? $_GET['n'] : 99;
    echo "ANI_$n.jpg:<br />\n";
    $exif = exif_read_data("ANI_$n.jpg", 'ANY_TAG', true);
    echo $exif===false ? "No header data found.<br />\n" : "Image contains the following headers:<br><br />\n";

    if ($exif) {
        foreach ($exif as $key => $section) {
            if (is_array($section)) {
                foreach ($section as $name => $val) {
                    echo "$key.$name: $val<br />\n";
                }
            } else {
                echo "$key: $section<br>\n";
            }
        }
    }
?>

The following is the content dumped by the script for the whooping crane image:

ANI_69.jpg:
Image contains the following headers:

FileName: ANI_69.jpg
FileDateTime: 1428255617
FileSize: 2448245
FileType: 2
MimeType: image/jpeg
SectionsFound: ANY_TAG, IFD0, THUMBNAIL, EXIF
COMPUTED.html: width="1798" height="2697"
COMPUTED.Height: 2697
COMPUTED.Width: 1798
COMPUTED.IsColor: 1
COMPUTED.ByteOrderMotorola: 0
COMPUTED.Copyright: Photographer name here
COMPUTED.Thumbnail.FileType: 2
COMPUTED.Thumbnail.MimeType: image/jpeg
ImageWidth: 1798
ImageLength: 2697
BitsPerSample.0: 8
BitsPerSample.1: 8
BitsPerSample.2: 8
PhotometricInterpretation: 2
Orientation: 1
SamplesPerPixel: 3
XResolution: 1000000/10000
YResolution: 1000000/10000
ResolutionUnit: 2
Software: Adobe Photoshop CS6 (Macintosh)
DateTime: 2014:12:28 19:17:36
Artist: Photographer name here
Copyright: Photographer name here
Exif_IFD_Pointer: 316
THUMBNAIL.Compression: 6
THUMBNAIL.XResolution: 72/1
THUMBNAIL.YResolution: 72/1
THUMBNAIL.ResolutionUnit: 2
THUMBNAIL.JPEGInterchangeFormat: 554
THUMBNAIL.JPEGInterchangeFormatLength: 3211
ExifVersion: 0230
DateTimeOriginal: 2014:11:03 11:14:27
DateTimeDigitized: 2014:11:03 11:14:27
SubSecTimeOriginal: 76
SubSecTimeDigitized: 76
ColorSpace: 65535
ExifImageWidth: 1798
ExifImageLength: 2697

Here's a dump of $exif from $exif = exif_read_data("ANI_$n.jpg", 'ANY_TAG', true);

Array
(
    [FILE] => Array
        (
            [FileName] => ANI_69.jpg
            [FileDateTime] => 1428255617
            [FileSize] => 2448245
            [FileType] => 2
            [MimeType] => image/jpeg
            [SectionsFound] => ANY_TAG, IFD0, THUMBNAIL, EXIF
        )

    [COMPUTED] => Array
        (
            [html] => width="1798" height="2697"
            [Height] => 2697
            [Width] => 1798
            [IsColor] => 1
            [ByteOrderMotorola] => 0
            [Copyright] => Digital Roux Photography LLC
            [Thumbnail.FileType] => 2
            [Thumbnail.MimeType] => image/jpeg
        )

    [IFD0] => Array
        (
            [ImageWidth] => 1798
            [ImageLength] => 2697
            [BitsPerSample] => Array
                (
                    [0] => 8
                    [1] => 8
                    [2] => 8
                )

            [PhotometricInterpretation] => 2
            [Orientation] => 1
            [SamplesPerPixel] => 3
            [XResolution] => 1000000/10000
            [YResolution] => 1000000/10000
            [ResolutionUnit] => 2
            [Software] => Adobe Photoshop CS6 (Macintosh)
            [DateTime] => 2014:12:28 19:17:36
            [Artist] => Digital Roux Photography LLC
            [Copyright] => Digital Roux Photography LLC
            [Exif_IFD_Pointer] => 316
        )

    [THUMBNAIL] => Array
        (
            [Compression] => 6
            [XResolution] => 72/1
            [YResolution] => 72/1
            [ResolutionUnit] => 2
            [JPEGInterchangeFormat] => 554
            [JPEGInterchangeFormatLength] => 3211
        )

    [EXIF] => Array
        (
            [ExifVersion] => 0230
            [DateTimeOriginal] => 2014:11:03 11:14:27
            [DateTimeDigitized] => 2014:11:03 11:14:27
            [SubSecTimeOriginal] => 76
            [SubSecTimeDigitized] => 76
            [ColorSpace] => 65535
            [ExifImageWidth] => 1798
            [ExifImageLength] => 2697
        )

)

enter image description here

like image 571
jerrygarciuh Avatar asked May 11 '15 20:05

jerrygarciuh


1 Answers

In three points (thanks to jerrygarciuh for his patience and help).

1) To see extra informations, just pass the third argument to true:

$exif = exif_read_data("ANI_$n.jpg", 'IFD0', true);

As explained here, it will force the conversion to an array to avoid conflicts between sections. You will find Tags under the IFD0.Keywords keyword.

2) There is an issue with WINXP.Keywords. To display correctly these informations, just set the encoding to UFT-8:

ini_set('exif.encode_unicode', 'UTF-8');

3) Thanks to this question from Ferdy, extra informations setted by Lightroom could be read using iptcparse. This is the full script:

ini_set('exif.encode_unicode', 'UTF-8');  // To see WINXP values

// Exif informations -- limited by PHP
$exif = exif_read_data("ANI_$n.jpg", 'ANY_TAG', true);
print_r($exif);

// Additionnal informations from Lightroom
getimagesize("ANI_$n.jpg", $infos);
if ( isset($infos['APP13']) ) {
    print_r(iptcparse($infos['APP13']));
}

Output:

Array
(
    [FILE] => Array
        (
            [FileName] => ANI_69.or.jpg
            [FileDateTime] => 1431382165
            [FileSize] => 2450950
            [FileType] => 2
            [MimeType] => image/jpeg
            [SectionsFound] => ANY_TAG, IFD0, THUMBNAIL, EXIF, WINXP
        )

    [COMPUTED] => Array
        (
            [html] => width="1798" height="2697"
            [Height] => 2697
            [Width] => 1798
            [IsColor] => 1
            [ByteOrderMotorola] => 1
            [Copyright] => Digital Roux Photography LLC
            [Thumbnail.FileType] => 2
            [Thumbnail.MimeType] => image/jpeg
        )

    [IFD0] => Array
        (
            [ImageWidth] => 1798
            [ImageLength] => 2697
            [BitsPerSample] => Array
                (
                    [0] => 8
                    [1] => 8
                    [2] => 8
                )

            [PhotometricInterpretation] => 2
            [ImageDescription] => Rusty Costanza / Digital Roux Photography
            [Orientation] => 1
            [SamplesPerPixel] => 3
            [XResolution] => 1000000/10000
            [YResolution] => 1000000/10000
            [ResolutionUnit] => 2
            [Software] => Adobe Photoshop CS6 (Macintosh)
            [DateTime] => 2014:12:28 19:17:36
            [Artist] => Digital Roux Photography LLC
            [Copyright] => Digital Roux Photography LLC
            [Exif_IFD_Pointer] => 2468
            [Title] => Rusty Costanza / Digital Roux Photography
            [Keywords] => whooping crane
            [UndefinedTag:0xEA1C] => �
        )

    [THUMBNAIL] => Array
        (
            [Compression] => 6
            [XResolution] => 72/1
            [YResolution] => 72/1
            [ResolutionUnit] => 2
            [JPEGInterchangeFormat] => 4894
            [JPEGInterchangeFormatLength] => 3371
        )

    [EXIF] => Array
        (
            [ExifVersion] => 0230
            [DateTimeOriginal] => 2014:11:03 11:14:27
            [DateTimeDigitized] => 2014:11:03 11:14:27
            [SubSecTimeOriginal] => 76
            [SubSecTimeDigitized] => 76
            [ColorSpace] => 65535
            [ExifImageWidth] => 1798
            [ExifImageLength] => 2697
            [UndefinedTag:0xEA1C] => �
        )

    [WINXP] => Array
        (
            [Title] => 刀甀猀琀礀 䌀漀猀琀愀渀稀愀 ⼀ 䐀椀最椀琀愀氀 刀漀甀砀 倀栀漀琀漀最爀愀瀀栀礀ഀ
            [Keywords] => 眀栀漀漀瀀椀渀最 挀爀愀渀攀
        )
)

Array
(
    [1#090] => Array
        (
            [0] => 
        )

    [2#000] => Array
        (
            [0] => 
        )

    [2#055] => Array
        (
            [0] => 20141103
        )

    [2#060] => Array
        (
            [0] => 111427+0000
        )

    [2#090] => Array
        (
            [0] => New Orleans
        )

    [2#025] => Array
        (
            [0] => whooping crane
        )

    [2#080] => Array
        (
            [0] => Digital Roux Photography LLC
        )

    [2#120] => Array
        (
            [0] => Rusty Costanza / Digital Roux Photography
        )

    [2#116] => Array
        (
            [0] => Digital Roux Photography LLC
        )

    [2#221] => Array
        (
            [0] => 0:0:0:-00001
        )

    [2#062] => Array
        (
            [0] => 20141103
        )
)

By the way, nice picture ;)

like image 103
Tiger-222 Avatar answered Nov 12 '22 20:11

Tiger-222