exif_read_data
(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
exif_read_data — Lee los encabezados EXIF en las imágenes
Descripción
Los encabezados EXIF tienden a estar presentes en las imágenes
JPEG/TIFF generadas por las cámaras digitales, pero desafortunadamente,
cada cámara digital tiene una idea diferente de cómo
sus imágenes deben ser marcadas, por lo que no siempre se puede contar
con un encabezado EXIF específico, aunque esté presente.
Los parámetros Height
y Width
se calculan de la misma manera que para la función getimagesize(),
por lo que sus valores no formarán parte de ningún encabezado devuelto. De igual manera, el índice
html
es la representación textual de la altura/ancho
utilizada en una etiqueta de imagen HTML clásica.
Cuando un encabezado EXIF contiene una nota de Copyright, este encabezado
puede contener a su vez dos valores. Como esta solución es inconsistente con los estándares EXIF 2.10, la sección COMPUTED
devolverá los dos encabezados, Copyright.Photographer
y Copyright.Editor
, mientras que las secciones IFD0
contienen el array de bytes con caracteres NULL para separar las dos entradas;
o bien, solo la primera entrada si el tipo de datos era incorrecto
(comportamiento por defecto de EXIF). La sección COMPUTED
también
contendrá una entrada Copyright
, que será ya sea la cadena original
de copyright, o una lista de valores separados por comas de
fotos y copyright del autor.
La etiqueta UserComment
presenta el mismo problema que la etiqueta Copyright.
Puede almacenar dos valores: primero, el juego de caracteres utilizado, luego
el valor en sí. Si es así, la sección IFD
contendrá solo
el juego de caracteres, o un array de bytes. La sección COMPUTED
almacenará las dos entradas UserCommentEncoding
y
UserComment
. El índice UserComment
está disponible en ambos casos, y es preferible usarlo, en lugar del valor de la sección IFD0
.
exif_read_data() valida los datos de las etiquetas EXIF de acuerdo
con la especificación EXIF (» http://exif.org/Exif2-2.PDF, página 20).
Parámetros
file
-
La ubicación del archivo de imagen. Puede ser ya sea una ruta de acceso
al archivo (los wrappers de flujo también son soportados como
de costumbre), o un flujo resource.
required_sections
-
Lista de valores separados por comas
de las secciones que deben presentarse en el array de resultado.
Si ninguna de las secciones solicitadas se encuentra, el valor devuelto
es false
.
as_arrays
-
Especifica si cada sección debe convertirse en un array o no.
Las required_sections
COMPUTED
,
THUMBNAIL
y COMMENT
siempre serán
convertidas en arrays, ya que contienen nombres que podrían entrar en conflicto.
read_thumbnail
-
Cuando se define como true
, la miniatura misma es leída. De lo contrario,
solo se leen los datos contenidos en el archivo.
Valores devueltos
Devuelve un array asociativo donde los índices son los nombres de los encabezados y los valores
son los valores asociados a estos encabezados. Si no se puede devolver ningún dato,
exif_read_data() devolverá false
.
Errores/Excepciones
Pueden generarse errores de nivel E_WARNING
y/o E_NOTICE
para etiquetas no soportadas u otras condiciones de error potencial, pero la función intenta leer toda la información comprensible.
Ejemplos
Ejemplo #1 Ejemplo con exif_read_data()
<?php
echo "test1.jpg:<br />\n";
$exif = exif_read_data('tests/test1.jpg', 'IFD0');
echo $exif===false ? "No se encontraron encabezados de datos.<br />\n" : "La imagen contiene encabezados<br />\n";
$exif = exif_read_data('tests/test2.jpg', 0, true);
echo "test2.jpg:<br />\n";
foreach ($exif as $key => $section) {
foreach ($section as $name => $val) {
echo "$key.$name: $val<br />\n";
}
}
?>
La primera llamada falla porque la imagen no tiene encabezado de información.
El resultado del ejemplo
sería algo similar a:
test1.jpg:
No se encontraron encabezados de datos.
test2.jpg:
FILE.FileName: test2.jpg
FILE.FileDateTime: 1017666176
FILE.FileSize: 1240
FILE.FileType: 2
FILE.SectionsFound: ANY_TAG, IFD0, THUMBNAIL, COMMENT
COMPUTED.html: width="1" height="1"
COMPUTED.Height: 1
COMPUTED.Width: 1
COMPUTED.IsColor: 1
COMPUTED.ByteOrderMotorola: 1
COMPUTED.UserComment: Exif test image.
COMPUTED.UserCommentEncoding: ASCII
COMPUTED.Copyright: Photo (c) M.Boerger, Edited by M.Boerger.
COMPUTED.Copyright.Photographer: Photo (c) M.Boerger
COMPUTED.Copyright.Editor: Edited by M.Boerger.
IFD0.Copyright: Photo (c) M.Boerger
IFD0.UserComment: ASCII
THUMBNAIL.JPEGInterchangeFormat: 134
THUMBNAIL.JPEGInterchangeFormatLength: 523
COMMENT.0: Comment #1.
COMMENT.1: Comment #2.
COMMENT.2: Comment #3end
THUMBNAIL.JPEGInterchangeFormat: 134
THUMBNAIL.Thumbnail.Height: 1
THUMBNAIL.Thumbnail.Height: 1
Ejemplo #2 exif_read_data() con flujos disponibles desde PHP 7.2.0
<?php
// Abrir el archivo, esto debería ser en modo binario
$fp = fopen('/path/to/image.jpg', 'rb');
if (!$fp) {
echo 'Error: No se pudo abrir la imagen para lectura';
exit;
}
// Intentar leer los encabezados EXIF
$headers = exif_read_data($fp);
if (!$headers) {
echo 'Error: No se pudieron leer los encabezados exif';
exit;
}
// Mostrar los encabezados 'COMPUTED'
echo 'EXIF Headers:' . PHP_EOL;
foreach ($headers['COMPUTED'] as $header => $value) {
printf(' %s => %s%s', $header, $value, PHP_EOL);
}
?>
El resultado del ejemplo
sería algo similar a:
EXIF Headers:
Height => 576
Width => 1024
IsColor => 1
ByteOrderMotorola => 0
ApertureFNumber => f/5.6
UserComment =>
UserCommentEncoding => UNDEFINED
Copyright => Denis
Thumbnail.FileType => 2
Thumbnail.MimeType => image/jpeg
Notas
Nota:
Si mbstring está activado, EXIF intentará
tratar el Unicode y elegir un juego de caracteres como se especifica por
exif.decode_unicode_motorola y
exif.decode_unicode_intel.
La extensión EXIF no intentará determinar el codificado por sí misma, y es
responsabilidad del usuario especificar correctamente el codificado a usar
para el decodificado definiendo una de las dos directivas INI antes
de llamar a exif_read_data().
Nota:
Si el parámetro file
se usa para pasar un
flujo a la función, entonces el flujo debe ser reposicionable. Tenga en cuenta que la
posición del puntero de un archivo no se modifica después del retorno de
esta función.