exif_read_data

(PHP 4 >= 4.2.0, PHP 5)

exif_read_data --  從 JPEGTIFF 檔案中讀取 EXIF 頭訊息

說明

array exif_read_data ( string filename [, string sections [, bool arrays [, bool thumbnail]]] )

exif_read_data() 函數從 JPEG 或 TIFF 圖像檔案中讀取 EXIF 頭訊息。這樣就可以讀取數位相機產生的元資料。

Exif 頭訊息往往存在於數位相機建立的 JPEG/TIFF 圖像中,但不幸的是每個數位相機製造商的旗標都不同,因此(編寫代碼時)不能依賴於某個特定的 Exif 頭訊息。

Height 和 Width 是用和 getimagesize() 一樣的方法計算的,因此它們的值不能是任何返回的頭訊息的部分。此外 html 是一個 height/width 的文字字串可以用於普通的 HTML 中。

當一個 Exif 頭訊息包括有一個 Copyright 時注意它本身可以包括兩個值。解決專案和 Exif 2.10 標準不一致,COMPUTED 區段會同時返回 Copyright.PhotographerCopyright.Editor,但是 IFD0 區段則包括有一個位元組陣列用 NULL 字元分隔開兩個項目。或是只有第一項若果資料類型錯誤的話(Exif 的標準行為)。COMPUTED 也會包括 Copyright,要麼是原始的版權字串,要麼是逗號分隔的攝像與編輯的版權訊息。

UserComment 旗標和 Copyright 有同樣的問題。它也可以存儲兩個值,第一個是使用的編碼模式,第二個是其值本身。若果這樣則 IFD0 區段僅包括編碼模式或是一個位元組陣列。COMPUTED 區段將存儲兩個值到 UserCommentEncodingUserCommentUserComment 在兩種情況下都可用因此應該優先使用它而不是 IFD0 區段中的該值。

exif_read_data() 還會根據 EXIF 規範(http://exif.org/Exif2-2.PDF,第 20 頁)來驗證 EXIF 資料。

注: Windows ME/XP 在連線到數位相機時能清除掉 Exif 頭訊息。更多訊息見 http://www.canon.co.jp/Imaging/NOTICE/011214-e.html

參數

filename

被讀取的圖像檔案名。不能是 URL

sections

是需要存在於檔案中的逗號分隔的區段清單用來產生結果陣列。若果找不到所請求的區段則返回值為 FALSE

FILEFileName, FileSize, FileDateTime, SectionsFound
COMPUTED html,Width,Height,IsColor,可能有更多其它的。Height 和 Width 是用和 getimagesize() 一樣的方法計算的,因此它們的值不能是任何返回的頭訊息的部分。此外 html 是一個 height/width 的文字字串可以用於普通的 HTML 中。
ANY_TAG任何包括有旗標的訊息,例如 IFD0,EXIF,...
IFD0 所有 IFD0 的旗標資料。在標準的圖像檔案中這包括了圖像大小及其它。
THUMBNAIL 若果有第二個 IFD,檔案應該包括有縮略圖。所有有關內嵌縮略圖的旗標訊息都存儲在本區。
COMMENTJPEG 圖像的注解頭訊息。
EXIF EXIF 區段是 IFDO 的子區,包括有圖像的更多詳細訊息。大多數內容都是數位相機關聯的。

arrays

指定了是否每個區段都成為一個陣列。sections COMPUTEDTHUMBNAILCOMMENT 區段總是成為陣列,因為它們裡面包含的名字和其它區段衝突。

thumbnail

當設定為 TRUE 時,讀取縮略圖本身。否則唯讀取旗標資料。

返回值

返回一個關聯陣列,鍵名是頭訊息名,值為與其相應的值。若果沒有可供返回的資料,exif_read_data() 將返回 FALSE

更新日誌

版本說明
4.3.0 可以讀取所有內嵌的 IFD 資料,內含陣列(也返回陣列)。此外內嵌的縮略圖的大小內含在 THUMBNAIL 子陣列中並且 exif_read_data() 可以將縮略圖按照 TIFF 格式返回。最後,不再有返回值最大長度的限制了(直到達到記憶體限定)。
4.3.0 若果 PHP 有 mbstring 支援,則會員注解可以自動改變編碼。此外,若果會員注解使用 Unicode 或 JIS 編碼,將會根據 EXIF 在 php.ini 中的 設定被自動改變。
4.3.0 若果圖像包括任何 IFD0 資料,則 COMPUTED 會包括有一項 ByteOrderMotorola,對於 little-endian (intel) 位元組順序,其值為 0,對於 big-endian (motorola) 位元組順序,其值為 1。此外,COMPUTED 和 UserComment 在資料類型出錯時也不再僅包括第一個版權條目。

範例

例子 1. exif_read_data() 例子

<?php
echo "test1.jpg:<br />\n";
$exif exif_read_data('tests/test1.jpg''IFD0');
echo 
$exif===false "No header data found.<br />\n" "Image contains headers<br />\n";

$exif exif_read_data('tests/test2.jpg'0true);
echo 
"test2.jpg:<br />\n";
foreach (
$exif as $key => $section) {
    foreach (
$section as $name => $val) {
        echo 
"$key.$name: $val<br />\n";
    }
}
?>

第一個呼叫失敗了,因為圖像沒有頭訊息。

上例的輸出類似於:

test1.jpg:
No header data found.
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