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_sectionsCOMPUTED,THUMBNAILyCOMMENTsiempre 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.
    
Resultado del ejemplo anterior es 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);
}
?>
     
    Resultado del ejemplo anterior es 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.