Datos EXIF ​​(u otros metadatos) que Windows muestra pero PHP no

Resuelto jerrygarciuh asked hace 54 años • 1 respuestas

Estoy trabajando para extraer información de los archivos JPEG que un fotógrafo le proporcionó a mi cliente.

Cuando se examinan en Windows, todas las imágenes contienen datos en un campo llamado Etiquetas:

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Para hacer algunas pruebas, primero creé el siguiente script y estoy iterando sobre las entradas en los encabezados del archivo binario usando el siguiente código.

A veces obtengo valores para ImageDescription. A menudo, el texto incluye Copyright y Autor, pero el contenido de las etiquetas nunca aparece aquí y es la captura de ese contenido lo que el cliente más desea automatizar.

¿Alguien puede aconsejarme cómo puedo acceder al contenido del campo Etiquetas?

La copia cargada del archivo está aquí .

ACTUALIZACIÓN : se cambió IDF0 a ANY_TAG y se agregó el tercer argumento verdadero a exif_read_data() según la respuesta de Tiger-222. También se agregó la salida print_r al final de la publicación.

ACTUALIZACIÓN 2 Se agregaron llamadas solicitadas error_display() e ini_set() y también probé exif_read_data() 2do argumento de 0 en lugar de 'ANY_TAG' según 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";
            }
        }
    }
?>

El siguiente es el contenido arrojado por el script para la imagen de la grulla blanca:

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

Aquí hay un volcado de $exif de$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
        )

)

ingrese la descripción de la imagen aquí

jerrygarciuh avatar Jan 01 '70 08:01 jerrygarciuh
Aceptado

En tres puntos (gracias a jerrygarciuh por su paciencia y ayuda).

1) Para ver información adicional, simplemente pase el tercer argumento a true:

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

Como se explica aquí , forzará la conversión a una matriz para evitar conflictos entre secciones. Encontrará etiquetas debajo de la IFD0.Keywordspalabra clave.

2) Hay un problema con WINXP.Keywords. Para mostrar correctamente esta información, simplemente configure la codificación en UFT-8:

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

3) Gracias a esta pregunta de Ferdy , se pudo leer información adicional configurada por Lightroom usando iptcparse . Este es el guión completo:

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']));
}

Producción:

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
        )
)

Por cierto, bonita foto ;)

Tiger-222 avatar May 11 '2015 21:05 Tiger-222