<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/ref.exif.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'es',
  ),
  'this' => 
  array (
    0 => 'function.exif-read-data.php',
    1 => 'exif_read_data',
    2 => 'Lee los encabezados EXIF en las im&aacute;genes',
  ),
  'up' => 
  array (
    0 => 'ref.exif.php',
    1 => 'Funciones de Exif',
  ),
  'prev' => 
  array (
    0 => 'function.exif-imagetype.php',
    1 => 'exif_imagetype',
  ),
  'next' => 
  array (
    0 => 'function.exif-tagname.php',
    1 => 'exif_tagname',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    'path' => 'reference/exif/functions/exif-read-data.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="function.exif-read-data" class="refentry">
 <div class="refnamediv">
  <h1 class="refname">exif_read_data</h1>
  <p class="verinfo">(PHP 4 &gt;= 4.2.0, PHP 5, PHP 7, PHP 8)</p><p class="refpurpose"><span class="refname">exif_read_data</span> &mdash; <span class="dc-title">Lee los encabezados <abbr title="Exchangeable Image File ">EXIF</abbr> en las imágenes</span></p>

 </div>
 <div class="refsect1 description" id="refsect1-function.exif-read-data-description">
  <h3 class="title">Descripción</h3>
  <div class="methodsynopsis dc-description">
   <span class="methodname"><strong>exif_read_data</strong></span>(<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>|<span class="type"><a href="language.types.string.php" class="type string">string</a></span></span> <code class="parameter">$file</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><span class="type"><a href="language.types.null.php" class="type null">?</a></span><span class="type"><a href="language.types.string.php" class="type string">string</a></span></span> <code class="parameter">$required_sections</code><span class="initializer"> = <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></span></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span> <code class="parameter">$as_arrays</code><span class="initializer"> = <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong></span></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span> <code class="parameter">$read_thumbnail</code><span class="initializer"> = <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong></span></span><br>): <span class="type"><span class="type"><a href="language.types.array.php" class="type array">array</a></span>|<span class="type"><a href="language.types.singleton.php" class="type false">false</a></span></span></div>

  <p class="simpara">
   <span class="function"><strong>exif_read_data()</strong></span> lee los encabezados <abbr title="Exchangeable Image File ">EXIF</abbr>
   de las imágenes.
   Con esta función, se pueden leer los datos meta generados por las cámaras
   digitales.
  </p>
  <p class="simpara">
   Los encabezados <abbr title="Exchangeable Image File ">EXIF</abbr> 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.
  </p>
  <p class="simpara">
   Los parámetros <code class="literal">Height</code> y <code class="literal">Width</code>
   se calculan de la misma manera que para la función <span class="function"><a href="function.getimagesize.php" class="function">getimagesize()</a></span>,
   por lo que sus valores no formarán parte de ningún encabezado devuelto. De igual manera, el índice
   <code class="literal">html</code> es la representación textual de la altura/ancho
   utilizada en una etiqueta de imagen <abbr title="Hyper Text Markup Language">HTML</abbr> clásica.
  </p>
  <p class="simpara">
   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 <code class="literal">COMPUTED</code>
   devolverá los dos encabezados, <code class="literal">Copyright.Photographer</code>
   y <code class="literal">Copyright.Editor</code>, mientras que las secciones <code class="literal">IFD0</code>
   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 <code class="literal">COMPUTED</code> también
   contendrá una entrada <code class="literal">Copyright</code>, que será ya sea la cadena original
   de copyright, o una lista de valores separados por comas de
   fotos y copyright del autor.
  </p>
  <p class="simpara">
   La etiqueta <code class="literal">UserComment</code> 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 <code class="literal">IFD</code> contendrá solo
   el juego de caracteres, o un array de bytes. La sección <code class="literal">COMPUTED</code>
   almacenará las dos entradas <code class="literal">UserCommentEncoding</code> y
  <code class="literal">UserComment</code>. El índice <code class="literal">UserComment</code>
  está disponible en ambos casos, y es preferible usarlo, en lugar del valor de la sección <code class="literal">IFD0</code>.
  </p>
  <p class="simpara">
   <span class="function"><strong>exif_read_data()</strong></span> valida los datos de las etiquetas EXIF de acuerdo
   con la especificación EXIF (<a href="http://exif.org/Exif2-2.PDF" class="link external">&raquo;&nbsp;http://exif.org/Exif2-2.PDF</a>, página 20).
  </p>
 </div>

 <div class="refsect1 parameters" id="refsect1-function.exif-read-data-parameters">
  <h3 class="title">Parámetros</h3>
  <dl>
   
    <dt><code class="parameter">file</code></dt>
    <dd>
     <span class="simpara">
      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 <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>.
     </span>
    </dd>
   
   
    <dt><code class="parameter">required_sections</code></dt>
    <dd>
     <p class="para">
      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 <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>.
      <table class="doctable informaltable">
       
        <tbody class="tbody">
         <tr>
          <td>FILE</td>
          <td>FileName (nombre del archivo), FileSize (tamaño del archivo),
          FileDateTime (fecha de modificación del archivo), SectionsFound (secciones encontradas)</td>
         </tr>

         <tr>
          <td>COMPUTED</td>
          <td>
           Atributo Html, ancho, altura, color o blanco y negro y más si está disponible.
           El ancho y la altura se calculan de la misma manera que la función
           <span class="function"><a href="function.getimagesize.php" class="function">getimagesize()</a></span>, por lo que sus valores nunca
           deberían diferir. De igual manera, el índice
          <code class="literal">html</code> es la representación textual de la altura/ancho
          utilizada en una etiqueta de imagen <abbr title="Hyper Text Markup Language">HTML</abbr> clásica.
          </td>
         </tr>

         <tr>
          <td>ANY_TAG</td>
          <td>
           Toda la información concerniente a esta etiqueta, como
           <code class="literal">IFD0</code>, <code class="literal">EXIF</code>, ...
          </td>
         </tr>

         <tr>
          <td>IFD0</td>
          <td>
           Todas las etiquetas <code class="literal">IFD0</code>.
           En imágenes normales, contienen las
           dimensiones de la imagen, etc.
          </td>
         </tr>

         <tr>
          <td>THUMBNAIL</td>
          <td>
           Un archivo que contiene una miniatura, si hay un segundo <code class="literal">IFD</code>.
           Toda la información etiquetada sobre esta miniatura
           será almacenada en esta sección.
          </td>
         </tr>

         <tr>
          <td>COMMENT</td>
          <td>Encabezado de comentario de las imágenes JPEG.</td>
         </tr>

         <tr>
          <td>EXIF</td>
          <td>
           La sección EXIF es una subsección de la sección <code class="literal">IFD0</code>. Ella
           contiene información más detallada sobre las imágenes. La mayoría
           de estos índices están relacionados con las cámaras digitales.
          </td>
         </tr>

        </tbody>
       
      </table>

     </p>
    </dd>
   
   
    <dt><code class="parameter">as_arrays</code></dt>
     <dd>
     <span class="simpara">
      Especifica si cada sección debe convertirse en un array o no.
      Las <code class="parameter">required_sections</code>  <code class="literal">COMPUTED</code>,
      <code class="literal">THUMBNAIL</code> y <code class="literal">COMMENT</code> siempre serán
      convertidas en arrays, ya que contienen nombres que podrían entrar en conflicto.
     </span>
    </dd>
   
   
    <dt><code class="parameter">read_thumbnail</code></dt>
    <dd>
     <span class="simpara">
      Cuando se define como <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>, la miniatura misma es leída. De lo contrario,
      solo se leen los datos contenidos en el archivo.
     </span>
    </dd>
   
  </dl>
 </div>

 <div class="refsect1 returnvalues" id="refsect1-function.exif-read-data-returnvalues">
  <h3 class="title">Valores devueltos</h3>
  <p class="simpara">
   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,
   <span class="function"><strong>exif_read_data()</strong></span> devolverá <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>.
  </p>
 </div>


 <div class="refsect1 errors" id="refsect1-function.exif-read-data-errors">
  <h3 class="title">Errores/Excepciones</h3>
  <p class="simpara">
   Pueden generarse errores de nivel <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> y/o <strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong>
   para etiquetas no soportadas u otras condiciones de error potencial, pero la función intenta leer toda la información comprensible.
  </p>
 </div>


 <div class="refsect1 changelog" id="refsect1-function.exif-read-data-changelog">
  <h3 class="title">Historial de cambios</h3>
  <table class="doctable informaltable">
   
    <thead>
     <tr>
      <th>Versión</th>
      <th>Descripción</th>
     </tr>

    </thead>

    <tbody class="tbody">
     <tr>
      <td>8.0.0</td>
      <td>
       <code class="parameter">required_sections</code> ahora es nullable.
      </td>
     </tr>

     <tr>
      <td>7.2.0</td>
      <td>
       <p class="para">
        Se ha añadido el soporte para los siguientes formatos EXIF:
        <ul class="simplelist">
         <li>Samsung</li>
         <li>DJI</li>
         <li>Panasonic</li>
         <li>Sony</li>
         <li>Pentax</li>
         <li>Minolta</li>
         <li>Sigma/Foveon</li>
         <li>AGFA</li>
         <li>Kyocera</li>
         <li>Ricoh</li>
         <li>Epson</li>
        </ul>
       </p>
      </td>
     </tr>

    </tbody>
   
  </table>

 </div>

 <div class="refsect1 examples" id="refsect1-function.exif-read-data-examples">
  <h3 class="title">Ejemplos</h3>
  <div class="example" id="example-1">
   <p><strong>Ejemplo #1 Ejemplo con <span class="function"><strong>exif_read_data()</strong></span></strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"test1.jpg:&lt;br /&gt;\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$exif </span><span style="color: #007700">= </span><span style="color: #0000BB">exif_read_data</span><span style="color: #007700">(</span><span style="color: #DD0000">'tests/test1.jpg'</span><span style="color: #007700">, </span><span style="color: #DD0000">'IFD0'</span><span style="color: #007700">);<br />echo </span><span style="color: #0000BB">$exif</span><span style="color: #007700">===</span><span style="color: #0000BB">false </span><span style="color: #007700">? </span><span style="color: #DD0000">"No se encontraron encabezados de datos.&lt;br /&gt;\n" </span><span style="color: #007700">: </span><span style="color: #DD0000">"La imagen contiene encabezados&lt;br /&gt;\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$exif </span><span style="color: #007700">= </span><span style="color: #0000BB">exif_read_data</span><span style="color: #007700">(</span><span style="color: #DD0000">'tests/test2.jpg'</span><span style="color: #007700">, </span><span style="color: #0000BB">0</span><span style="color: #007700">, </span><span style="color: #0000BB">true</span><span style="color: #007700">);<br />echo </span><span style="color: #DD0000">"test2.jpg:&lt;br /&gt;\n"</span><span style="color: #007700">;<br />foreach (</span><span style="color: #0000BB">$exif </span><span style="color: #007700">as </span><span style="color: #0000BB">$key </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$section</span><span style="color: #007700">) {<br />    foreach (</span><span style="color: #0000BB">$section </span><span style="color: #007700">as </span><span style="color: #0000BB">$name </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$val</span><span style="color: #007700">) {<br />        echo </span><span style="color: #DD0000">"</span><span style="color: #0000BB">$key</span><span style="color: #DD0000">.</span><span style="color: #0000BB">$name</span><span style="color: #DD0000">: </span><span style="color: #0000BB">$val</span><span style="color: #DD0000">&lt;br /&gt;\n"</span><span style="color: #007700">;<br />    }<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents"><p>
    La primera llamada falla porque la imagen no tiene encabezado de información.
   </p></div>
   <div class="example-contents"><p>Resultado del ejemplo anterior es similar a:</p></div>
   <div class="example-contents screen">
<div class="examplescode"><pre class="examplescode">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=&quot;1&quot; height=&quot;1&quot;
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</pre>
</div>
   </div>
  </div>
  <div class="example" id="example-2">
   <p><strong>Ejemplo #2 <span class="function"><strong>exif_read_data()</strong></span> con flujos disponibles desde PHP 7.2.0</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// Abrir el archivo, esto debería ser en modo binario<br /></span><span style="color: #0000BB">$fp </span><span style="color: #007700">= </span><span style="color: #0000BB">fopen</span><span style="color: #007700">(</span><span style="color: #DD0000">'/path/to/image.jpg'</span><span style="color: #007700">, </span><span style="color: #DD0000">'rb'</span><span style="color: #007700">);<br /><br />if (!</span><span style="color: #0000BB">$fp</span><span style="color: #007700">) {<br />    echo </span><span style="color: #DD0000">'Error: No se pudo abrir la imagen para lectura'</span><span style="color: #007700">;<br />    exit;<br />}<br /><br /></span><span style="color: #FF8000">// Intentar leer los encabezados EXIF<br /></span><span style="color: #0000BB">$headers </span><span style="color: #007700">= </span><span style="color: #0000BB">exif_read_data</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">);<br /><br />if (!</span><span style="color: #0000BB">$headers</span><span style="color: #007700">) {<br />    echo </span><span style="color: #DD0000">'Error: No se pudieron leer los encabezados exif'</span><span style="color: #007700">;<br />    exit;<br />}<br /><br /></span><span style="color: #FF8000">// Mostrar los encabezados 'COMPUTED'<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">'EXIF Headers:' </span><span style="color: #007700">. </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br />foreach (</span><span style="color: #0000BB">$headers</span><span style="color: #007700">[</span><span style="color: #DD0000">'COMPUTED'</span><span style="color: #007700">] as </span><span style="color: #0000BB">$header </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$value</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">' %s =&gt; %s%s'</span><span style="color: #007700">, </span><span style="color: #0000BB">$header</span><span style="color: #007700">, </span><span style="color: #0000BB">$value</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">);<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents"><p>Resultado del ejemplo anterior es similar a:</p></div>
   <div class="example-contents screen">
<div class="examplescode"><pre class="examplescode">EXIF Headers:
 Height =&gt; 576
 Width =&gt; 1024
 IsColor =&gt; 1
 ByteOrderMotorola =&gt; 0
 ApertureFNumber =&gt; f/5.6
 UserComment =&gt;
 UserCommentEncoding =&gt; UNDEFINED
 Copyright =&gt; Denis
 Thumbnail.FileType =&gt; 2
 Thumbnail.MimeType =&gt; image/jpeg</pre>
</div>
   </div>
  </div>
 </div>


 <div class="refsect1 notes" id="refsect1-function.exif-read-data-notes">
  <h3 class="title">Notas</h3>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <span class="simpara">
    Si <a href="ref.mbstring.php" class="link">mbstring</a> está activado, EXIF intentará
    tratar el Unicode y elegir un juego de caracteres como se especifica por
    <a href="exif.configuration.php#ini.exif.decode-unicode-motorola" class="link">exif.decode_unicode_motorola</a> y
    <a href="exif.configuration.php#ini.exif.decode-unicode-intel" class="link">exif.decode_unicode_intel</a>.
    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 <span class="function"><strong>exif_read_data()</strong></span>.
   </span>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <span class="simpara">
    Si el parámetro <code class="parameter">file</code> 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.
   </span>
  </p></blockquote>
 </div>


 <div class="refsect1 seealso" id="refsect1-function.exif-read-data-seealso">
  <h3 class="title">Ver también</h3>
  <ul class="simplelist">
   <li><span class="function"><a href="function.exif-thumbnail.php" class="function" rel="rdfs-seeAlso">exif_thumbnail()</a> - Recupera la miniatura de una imagen</span></li>
   <li><span class="function"><a href="function.getimagesize.php" class="function" rel="rdfs-seeAlso">getimagesize()</a> - Devuelve el tama&ntilde;o de una imagen</span></li>
   <li><a href="wrappers.php" class="xref">Protocolos y Envolturas soportados</a></li>
  </ul>
 </div>

</div><?php manual_footer($setup); ?>