<?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 => 'pt_BR',
  ),
  'this' => 
  array (
    0 => 'function.exif-read-data.php',
    1 => 'exif_read_data',
    2 => 'L&ecirc; os cabe&ccedil;alhos EXIF de um arquivo de imagen',
  ),
  'up' => 
  array (
    0 => 'ref.exif.php',
    1 => 'Fun&ccedil;&otilde;es 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' => 'pt_BR',
    '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">Lê os cabeçalhos <abbr title="Exchangeable Image File ">EXIF</abbr> de um arquivo de imagen</span></p>

 </div>
 <div class="refsect1 description" id="refsect1-function.exif-read-data-description">
  <h3 class="title">Descrição</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">
   A função <span class="function"><strong>exif_read_data()</strong></span> lê os cabeçalhos
   <abbr title="Exchangeable Image File ">EXIF</abbr> de um arquivo de imagem. Desta forma é possível ler metadados
   gerados por câmeras digitais.
  </p>
  <p class="simpara">
   Cabeçalhos <abbr title="Exchangeable Image File ">EXIF</abbr> tendem a estar presentes em imagens JPEG/TIFF geradas por camêras
   digitais, mas infelizmente, cada fabricante de camêra digital tem
   uma ideia diferente de como rotular suas imagens, então não se
   pode confiar sempre que um cabeçalho EXIF específico estará presente.
  </p>
  <p class="simpara">
   Altura (<code class="literal">Height</code>) e largura (<code class="literal">Width</code>) sao computadas
   da mesma maneira que <span class="function"><a href="function.getimagesize.php" class="function">getimagesize()</a></span> faz, então seus valores não devem
   ser parte de nenhum cabeçalho retornado. Além disso, <code class="literal">html</code> é
   uma string de texto com altura/largura a ser usado dentro de um<abbr title="Hyper Text Markup Language">HTML</abbr> normal.
  </p>
  <p class="simpara">
   Quando um cabeçalho Exif contém uma nota de direitos autorais, esta nota pode conter dois
   valores. Como a solução é inconsistente com o padrão Exif 2.10 a seção
   <code class="literal">COMPUTED</code> irá retornar ambas as entradas
   <code class="literal">Copyright.Photographer</code>
   e <code class="literal">Copyright.Editor</code> enquanto que as seções <code class="literal">IFD0</code>
   contém um array de bytes com o caractere NULL que separa as duas
   entradas. Ou apenas a primeira entrada se o tipo de dados estiver errado (funcionamento normal
   do Exif). <code class="literal">COMPUTED</code> irá conter também a entrada
   <code class="literal">Copyright</code> que será a string original do copyright
   ou uma lista separada por vírgula dos direitos autorais da foto e do editor.
  </p>
  <p class="simpara">
   A etiqueta <code class="literal">UserComment</code> tem o mesmo problema que a etiqueta de
   Copyright. Ela pode guardar dois valores. Primeiro a codificação usada e em segundo o valor
   em si. Então a seção <code class="literal">IFD</code> contém somente a codificação
   ou um array de bytes. A seção <code class="literal">COMPUTED</code> irá guardar ambos nas
   entradas <code class="literal">UserCommentEncoding</code> e
   <code class="literal">UserComment</code>. A entrada <code class="literal">UserComment</code>
   está disponível em ambos os casos então deve ser usada em preferência ao
   valor da seção <code class="literal">IFD0</code>.
  </p>
  <p class="simpara">
   <span class="function"><strong>exif_read_data()</strong></span> também valida etiquetas de dados EXIF de acordo
   com a especificação 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">
      A localização do arquivo de imagem. Pode ser uma caminho para o arquivo
      (empacotadores de fluxo são também suportados)
      ou um fluxo do tipo <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">
      Uma lista de seções separadas por vírgula que precisam estar presentes no arquivo
      para produzir o resultado do tipo <span class="type"><a href="language.types.array.php" class="type array">array</a></span>. Se nenhuma das seções informadas
      puder ser encontrada o valor de retorno é <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, FileSize, FileDateTime, SectionsFound</td>
         </tr>

         <tr>
          <td>COMPUTED</td>
          <td>
           html, Width, Height, IsColor, e mais se disponíveis. Height e
           Width são computadas da mesma maneira que <span class="function"><a href="function.getimagesize.php" class="function">getimagesize()</a></span>
           faz, portanto seus valores não deve ser parte de nenhum cabeçalho retornado.
           Além disso, <code class="literal">html</code> é uma string de texto com altura/largura a ser usado dentro de um
           <abbr title="Hyper Text Markup Language">HTML</abbr> normal.
          </td>
         </tr>

         <tr>
          <td>ANY_TAG</td>
          <td>Qualquer informação que tenha uma etiqueta, ex.: <code class="literal">IFD0</code>, <code class="literal">EXIF</code>, ...</td>
         </tr>

         <tr>
          <td>IFD0</td>
          <td>
           Todos os dados etiquetados de IFD0. Em arquivos de imagem normais, contém
           o tamanho da imagem e outros dados.
          </td>
         </tr>

         <tr>
          <td>THUMBNAIL</td>
          <td>
           Um arquivo deveria ter uma miniatura se tiver um segundo <code class="literal">IFD</code>.
           Todas as informações etiquetadas sobre a miniatura embutida estão gravadas
           nesta seção.
          </td>
         </tr>

         <tr>
          <td>COMMENT</td>
          <td>Cabeçalho de comentários de imagens JPEG.</td>
         </tr>

         <tr>
          <td>EXIF</td>
          <td>
           A seção EXIF é uma sub-seção de <code class="literal">IFD0</code>. Contém
           informação mais detalhada sobre uma imagem. A maior parte destas entradas
           são relacionadas a câmeras digitais.
          </td>
         </tr>

        </tbody>
       
      </table>

     </p>
    </dd>
   
   
    <dt><code class="parameter">as_arrays</code></dt>
     <dd>
     <span class="simpara">
      Especifica se cada seção se torna ou não um array. As seções
      <code class="literal">COMPUTED</code>, <code class="literal">THUMBNAIL</code> E
      <code class="literal">COMMENT</code> de <code class="parameter">required_sections</code>
      sempre se toranm arrays por que contêm valores cujos nomes conflitam
      com outras seções.
     </span>
    </dd>
   
   
    <dt><code class="parameter">read_thumbnail</code></dt>
    <dd>
     <span class="simpara">
      Quando definida para <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> a miniatura em si é lida. Caso contrário, apenas
      os dados etiquetados são lidos.
     </span>
    </dd>
   
  </dl>
 </div>

 <div class="refsect1 returnvalues" id="refsect1-function.exif-read-data-returnvalues">
  <h3 class="title">Valor Retornado</h3>
  <p class="simpara">
   Retorna um <span class="type"><a href="language.types.array.php" class="type array">array</a></span> associativo onde os índices são
   os nomes dos cabeçalhos e os valores são os associados com
   esses cabeçalhos. Se nenhum dado puder ser retornado,
   <span class="function"><strong>exif_read_data()</strong></span> retornará <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">Erros/Exceções</h3>
  <p class="simpara">
   Erros de nível <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> e/ou <strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong>
   podem ser disparados para etiquetas não suportadas ou outras condições de erros potenciais, mas a
   função ainda tenta lêr toda a informação compreensível.
  </p>
 </div>


 <div class="refsect1 changelog" id="refsect1-function.exif-read-data-changelog">
  <h3 class="title">Registro de Alterações</h3>
  <table class="doctable informaltable">
   
    <thead>
     <tr>
      <th>Versão</th>
      <th>Descrição</th>
     </tr>

    </thead>

    <tbody class="tbody">
     <tr>
      <td>8.0.0</td>
      <td>
       <code class="parameter">required_sections</code> agora pode ser nulo.
      </td>
     </tr>

     <tr>
      <td>7.2.0</td>
      <td>
       O parâmetro <code class="parameter">file</code> agora suporta tanto arquivos locais
       quanto recursos de fluxo.
      </td>
     </tr>

     <tr>
      <td>7.2.0</td>
      <td>
       <p class="para">
        Adicionado suporte aos seguintes 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">Exemplos</h3>
  <div class="example" id="example-1">
   <p><strong>Exemplo #1 Exemplo <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">"Dados de cabeçalho não encontrados.&lt;br /&gt;\n" </span><span style="color: #007700">: </span><span style="color: #DD0000">"Imagem contém cabeçalhos&lt;br /&gt;"</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>
    A primeira chamada falha porque a imagem não tem informações no cabeçalho.
   </p></div>
   <div class="example-contents"><p>O exemplo acima produzirá
algo semelhante a:</p></div>
   <div class="example-contents screen">
<div class="examplescode"><pre class="examplescode">test1.jpg:
Dados de cabeçalho não encontrados.
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>Exemplo #2 <span class="function"><strong>exif_read_data()</strong></span> com fluxos, disponível a partir do 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">// Abre um arquivos, deve ser em modo binário<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">'Erro: Não foi possível abrir a imagem para leitura'</span><span style="color: #007700">;<br />    exit;<br />}<br /><br /></span><span style="color: #FF8000">// Tenta ler o cabeçalhos 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">'Erro: Não foi possível ler os cabeçalhos exif'</span><span style="color: #007700">;<br />    exit;<br />}<br /><br /></span><span style="color: #FF8000">// Mostra os cabeçalhos de 'COMPUTED'<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">'Cabeçalhos EXIF:' </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>O exemplo acima produzirá
algo semelhante a:</p></div>
   <div class="example-contents screen">
<div class="examplescode"><pre class="examplescode">Cabeçalhos EXIF:
 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">
    Se <a href="ref.mbstring.php" class="link">mbstring</a> estiver habilitado, exif tentará processar
    em codificação unicode e escolher um conjunto de caracteres como especificado por
    <a href="exif.configuration.php#ini.exif.decode-unicode-motorola" class="link">exif.decode_unicode_motorola</a> e
    <a href="exif.configuration.php#ini.exif.decode-unicode-intel" class="link">exif.decode_unicode_intel</a>. A extensão
    exif não tentará descobrir a codificação por si mesma, é responsabilidade do programador
    especificar corretamente a codificação a ser usada, configurando uma das duas
    diretivas ini antes de chamar <span class="function"><strong>exif_read_data()</strong></span>.
   </span>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <span class="simpara">
    Se <code class="parameter">file</code> for usado para passar um fluxo a esta função, o fluxo
    deve ser do tipo pesquisável. Note que a posição do ponteiro do arquivo não é alterada depois que esta função retorna.
   </span>
  </p></blockquote>
 </div>

 <div class="refsect1 seealso" id="refsect1-function.exif-read-data-seealso">
  <h3 class="title">Veja Também</h3>
  <ul class="simplelist">
   <li><span class="function"><a href="function.exif-thumbnail.php" class="function" rel="rdfs-seeAlso">exif_thumbnail()</a> - Recupera a miniatura embutida de uma imagem</span></li>
   <li><span class="function"><a href="function.getimagesize.php" class="function" rel="rdfs-seeAlso">getimagesize()</a> - Obt&eacute;m o tamanho de uma imagem</span></li>
   <li><a href="wrappers.php" class="xref">Protocolos e empacotadores suportados</a></li>
  </ul>
 </div>

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