<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML ><HEAD ><TITLE >exif_read_data</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK REL="HOME" TITLE="PHP 手册" HREF="index.html"><LINK REL="UP" TITLE="Exif Functions" HREF="ref.exif.html"><LINK REL="PREVIOUS" TITLE="exif_imagetype" HREF="function.exif-imagetype.html"><LINK REL="NEXT" TITLE="exif_tagname" HREF="function.exif-tagname.html"><META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8"></HEAD ><BODY CLASS="refentry" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#840084" ALINK="#0000FF" ><DIV CLASS="NAVHEADER" ><TABLE SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TH COLSPAN="3" ALIGN="center" >PHP 手册</TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="bottom" ><A HREF="function.exif-imagetype.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" ></TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="function.exif-tagname.html" ACCESSKEY="N" >下一页</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><H1 ><A NAME="function.exif-read-data" ></A >exif_read_data</H1 ><DIV CLASS="refnamediv" ><A NAME="AEN48333" ></A ><P > (PHP 4 >= 4.2.0, PHP 5)</P >exif_read_data -- 从 <ACRONYM CLASS="acronym" >JPEG</ACRONYM > 或 <ACRONYM CLASS="acronym" >TIFF</ACRONYM > 文件中读取 <ACRONYM CLASS="acronym" >EXIF</ACRONYM > 头信息 </DIV ><DIV CLASS="refsect1" ><A NAME="AEN48339" ></A ><H2 >说明</H2 >array <B CLASS="methodname" >exif_read_data</B > ( string filename [, string sections [, bool arrays [, bool thumbnail]]] )<BR ></BR ><P > <B CLASS="function" >exif_read_data()</B > 函数从 JPEG 或 TIFF 图像文件中读取 EXIF 头信息。这样就可以读取数码相机产生的元数据。 </P ><P > Exif 头信息往往存在于数码相机生成的 JPEG/TIFF 图像中,但不幸的是每个数码相机制造商的标记都不同,因此(编写代码时)不能依赖于某个特定的 Exif 头信息。 </P ><P > Height 和 Width 是用和 <A HREF="function.getimagesize.html" ><B CLASS="function" >getimagesize()</B ></A > 一样的方法计算的,因此它们的值不能是任何返回的头信息的部分。此外 html 是一个 height/width 的文本字符串可以用于普通的 <ACRONYM CLASS="acronym" >HTML</ACRONYM > 中。 </P ><P > 当一个 Exif 头信息包含有一个 Copyright 时注意它本身可以包含两个值。解决方案和 Exif 2.10 标准不一致,COMPUTED 区段会同时返回 <SPAN CLASS="emphasis" ><I CLASS="emphasis" >Copyright.Photographer</I ></SPAN > 和 <SPAN CLASS="emphasis" ><I CLASS="emphasis" >Copyright.Editor</I ></SPAN >,但是 IFD0 区段则包含有一个字节数组用 NULL 字符分隔开两个项目。或者只有第一项如果数据类型错误的话(Exif 的正常行为)。COMPUTED 也会包含 <SPAN CLASS="emphasis" ><I CLASS="emphasis" >Copyright</I ></SPAN >,要么是原始的版权字符串,要么是逗号分隔的摄像与编辑的版权信息。 </P ><P > UserComment 标记和 Copyright 有同样的问题。它也可以存储两个值,第一个是使用的编码方式,第二个是其值本身。如果这样则 IFD0 区段仅包含编码方式或者一个字节数组。COMPUTED 区段将存储两个值到 <SPAN CLASS="emphasis" ><I CLASS="emphasis" >UserCommentEncoding</I ></SPAN > 和 <SPAN CLASS="emphasis" ><I CLASS="emphasis" >UserComment</I ></SPAN >。<SPAN CLASS="emphasis" ><I CLASS="emphasis" >UserComment</I ></SPAN > 在两种情况下都可用因此应该优先使用它而不是 IFD0 区段中的该值。 </P ><P > <B CLASS="function" >exif_read_data()</B > 还会根据 EXIF 规范(<A HREF="http://exif.org/Exif2-2.PDF" TARGET="_top" >http://exif.org/Exif2-2.PDF</A >,第 20 页)来验证 EXIF 数据。 </P ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >注意: </B > Windows ME/XP 在连接到数码相机时能清除掉 Exif 头信息。更多信息见 <A HREF="http://www.canon.co.jp/Imaging/NOTICE/011214-e.html" TARGET="_top" >http://www.canon.co.jp/Imaging/NOTICE/011214-e.html</A >。 </P ></BLOCKQUOTE ></DIV ></DIV ><DIV CLASS="refsect1" ><A NAME="AEN48376" ></A ><H2 >参数</H2 ><P > <P ></P ><DIV CLASS="variablelist" ><DL ><DT ><CODE CLASS="parameter" >filename</CODE ></DT ><DD ><P > 被读取的图像文件名。不能是 <ACRONYM CLASS="acronym" >URL</ACRONYM >。 </P ></DD ><DT ><CODE CLASS="parameter" >sections</CODE ></DT ><DD ><P > 是需要存在于文件中的逗号分隔的区段列表用来产生结果数组。如果未找到所请求的区段则返回值为 <TT CLASS="constant" ><B >FALSE</B ></TT >。 <DIV CLASS="informaltable" ><P ></P ><A NAME="AEN48392" ></A ><TABLE BORDER="1" CLASS="CALSTABLE" ><COL><COL><TBODY ><TR ><TD >FILE</TD ><TD >FileName, FileSize, FileDateTime, SectionsFound</TD ></TR ><TR ><TD >COMPUTED</TD ><TD > html,Width,Height,IsColor,可能有更多其它的。Height 和 Width 是用和 <A HREF="function.getimagesize.html" ><B CLASS="function" >getimagesize()</B ></A > 一样的方法计算的,因此它们的值不能是任何返回的头信息的部分。此外 html 是一个 height/width 的文本字符串可以用于普通的 <ACRONYM CLASS="acronym" >HTML</ACRONYM > 中。 </TD ></TR ><TR ><TD >ANY_TAG</TD ><TD >任何包含有标记的信息,例如 IFD0,EXIF,...</TD ></TR ><TR ><TD >IFD0</TD ><TD > 所有 IFD0 的标记数据。在标准的图像文件中这包含了图像大小及其它。 </TD ></TR ><TR ><TD >THUMBNAIL</TD ><TD > 如果有第二个 IFD,文件应该包含有缩略图。所有有关嵌入缩略图的标记信息都存储在本区。 </TD ></TR ><TR ><TD >COMMENT</TD ><TD >JPEG 图像的注释头信息。</TD ></TR ><TR ><TD >EXIF</TD ><TD > EXIF 区段是 IFDO 的子区,包含有图像的更多详细信息。大多数内容都是数码相机相关的。 </TD ></TR ></TBODY ></TABLE ><P ></P ></DIV > </P ></DD ><DT ><CODE CLASS="parameter" >arrays</CODE ></DT ><DD ><P > 指定了是否每个区段都成为一个数组。<CODE CLASS="parameter" >sections</CODE > <TT CLASS="literal" >COMPUTED</TT >,<TT CLASS="literal" >THUMBNAIL</TT > 和<TT CLASS="literal" >COMMENT</TT > 区段总是成为数组,因为它们里面包含的名字和其它区段冲突。 </P ></DD ><DT ><CODE CLASS="parameter" >thumbnail</CODE ></DT ><DD ><P > 当设定为 <TT CLASS="constant" ><B >TRUE</B ></TT > 时,读取缩略图本身。否则只读取标记数据。 </P ></DD ></DL ></DIV > </P ></DIV ><DIV CLASS="refsect1" ><A NAME="AEN48433" ></A ><H2 >返回值</H2 ><P > 返回一个关联数组,键名是头信息名,值为与其相应的值。如果没有可供返回的数据,<B CLASS="function" >exif_read_data()</B > 将返回 <TT CLASS="constant" ><B >FALSE</B ></TT >。 </P ></DIV ><DIV CLASS="refsect1" ><A NAME="AEN48438" ></A ><H2 >更新日志</H2 ><P > <DIV CLASS="informaltable" ><P ></P ><A NAME="AEN48441" ></A ><TABLE BORDER="1" CLASS="CALSTABLE" ><COL><COL><THEAD ><TR ><TH >版本</TH ><TH >说明</TH ></TR ></THEAD ><TBODY ><TR ><TD >4.3.0</TD ><TD > 可以读取所有嵌入的 <ACRONYM CLASS="acronym" >IFD</ACRONYM > 数据,包括数组(也返回数组)。此外嵌入的缩略图的大小包括在 <SPAN CLASS="emphasis" ><I CLASS="emphasis" >THUMBNAIL</I ></SPAN > 子数组中并且 <B CLASS="function" >exif_read_data()</B > 可以将缩略图按照 <ACRONYM CLASS="acronym" >TIFF</ACRONYM > 格式返回。最后,不再有返回值最大长度的限制了(直到达到内存限定)。 </TD ></TR ><TR ><TD >4.3.0</TD ><TD > 如果 PHP 有 <A HREF="ref.mbstring.html" >mbstring</A > 支持,则用户注释可以自动改变编码。此外,如果用户注释使用 Unicode 或 JIS 编码,将会根据 EXIF 在 <TT CLASS="filename" >php.ini</TT > 中的 设置被自动改变。 </TD ></TR ><TR ><TD >4.3.0</TD ><TD > 如果图像包含任何 IFD0 数据,则 COMPUTED 会包含有一项 ByteOrderMotorola,对于 little-endian (intel) 字节顺序,其值为 0,对于 big-endian (motorola) 字节顺序,其值为 1。此外,COMPUTED 和 UserComment 在数据类型出错时也不再仅包含第一个版权条目。 </TD ></TR ></TBODY ></TABLE ><P ></P ></DIV > </P ></DIV ><DIV CLASS="refsect1" ><A NAME="AEN48463" ></A ><H2 >范例</H2 ><P > <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN48466" ></A ><P ><B >例 1. <B CLASS="function" >exif_read_data()</B > 例子</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#007700">echo </font><font color="#DD0000">"test1.jpg:<br />\n"</font><font color="#007700">;<br /></font><font color="#0000BB">$exif </font><font color="#007700">= </font><font color="#0000BB">exif_read_data</font><font color="#007700">(</font><font color="#DD0000">'tests/test1.jpg'</font><font color="#007700">, </font><font color="#DD0000">'IFD0'</font><font color="#007700">);<br />echo </font><font color="#0000BB">$exif</font><font color="#007700">===</font><font color="#0000BB">false </font><font color="#007700">? </font><font color="#DD0000">"No header data found.<br />\n" </font><font color="#007700">: </font><font color="#DD0000">"Image contains headers<br />\n"</font><font color="#007700">;<br /><br /></font><font color="#0000BB">$exif </font><font color="#007700">= </font><font color="#0000BB">exif_read_data</font><font color="#007700">(</font><font color="#DD0000">'tests/test2.jpg'</font><font color="#007700">, </font><font color="#0000BB">0</font><font color="#007700">, </font><font color="#0000BB">true</font><font color="#007700">);<br />echo </font><font color="#DD0000">"test2.jpg:<br />\n"</font><font color="#007700">;<br />foreach (</font><font color="#0000BB">$exif </font><font color="#007700">as </font><font color="#0000BB">$key </font><font color="#007700">=> </font><font color="#0000BB">$section</font><font color="#007700">) {<br /> foreach (</font><font color="#0000BB">$section </font><font color="#007700">as </font><font color="#0000BB">$name </font><font color="#007700">=> </font><font color="#0000BB">$val</font><font color="#007700">) {<br /> echo </font><font color="#DD0000">"$key.$name: $val<br /></font><font color="#007700">\n</font><font color="#DD0000">"</font><font color="#007700">;<br /> }<br />}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P > 第一个调用失败了,因为图像没有头信息。 </P ><P >上例的输出类似于:</P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> test1.jpg:<br />No header data found.<br />test2.jpg:<br />FILE.FileName: test2.jpg<br />FILE.FileDateTime: 1017666176<br />FILE.FileSize: 1240<br />FILE.FileType: 2<br />FILE.SectionsFound: ANY_TAG, IFD0, THUMBNAIL, COMMENT<br />COMPUTED.html: width="1" height="1"<br />COMPUTED.Height: 1<br />COMPUTED.Width: 1<br />COMPUTED.IsColor: 1<br />COMPUTED.ByteOrderMotorola: 1<br />COMPUTED.UserComment: Exif test image.<br />COMPUTED.UserCommentEncoding: ASCII<br />COMPUTED.Copyright: Photo (c) M.Boerger, Edited by M.Boerger.<br />COMPUTED.Copyright.Photographer: Photo (c) M.Boerger<br />COMPUTED.Copyright.Editor: Edited by M.Boerger.<br />IFD0.Copyright: Photo (c) M.Boerger<br />IFD0.UserComment: ASCII<br />THUMBNAIL.JPEGInterchangeFormat: 134<br />THUMBNAIL.JPEGInterchangeFormatLength: 523<br />COMMENT.0: Comment #1.<br />COMMENT.1: Comment #2.<br />COMMENT.2: Comment #3end<br />THUMBNAIL.JPEGInterchangeFormat: 134<br />THUMBNAIL.Thumbnail.Height: 1<br />THUMBNAIL.Thumbnail.Height: 1</font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > </P ></DIV ><DIV CLASS="refsect1" ><A NAME="AEN48473" ></A ><H2 >参见</H2 ><P > <P ></P ><TABLE BORDER="0" ><TBODY ><TR ><TD ><A HREF="function.exif-thumbnail.html" ><B CLASS="function" >exif_thumbnail()</B ></A ></TD ></TR ><TR ><TD ><A HREF="function.getimagesize.html" ><B CLASS="function" >getimagesize()</B ></A ></TD ></TR ></TBODY ></TABLE ><P ></P > </P ></DIV ><DIV CLASS="NAVFOOTER" ><HR ALIGN="LEFT" WIDTH="100%"><TABLE SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><A HREF="function.exif-imagetype.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="index.html" ACCESSKEY="H" >起始页</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><A HREF="function.exif-tagname.html" ACCESSKEY="N" >下一页</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >exif_imagetype</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="ref.exif.html" ACCESSKEY="U" >上一级</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >exif_tagname</TD ></TR ></TABLE ></DIV ></BODY ></HTML >