PHP中讀取照片exif資訊的方法,_PHP教程

來源:互聯網
上載者:User

PHP中讀取照片exif資訊的方法,


先來瞭解什麼是圖片的Exif資訊

Exif是一種圖象檔案格式,它的資料存放區與JPEG格式是完全相同的。實際上Exif格式就是在JPEG格式頭部插入了數位照片的資訊,包括拍攝時的光圈、快門、白平衡、ISO、焦距、日期時間等各種和拍攝條件以及相機品牌、型號、色彩編碼、拍攝時錄製的聲音以及全球定位系統(GPS)、縮圖等。簡單地說,Exif=JPEG+拍攝參數。因此,你可以利用任何可以查看JPEG檔案的看圖軟體瀏覽Exif格式的照片,但並不是所有的圖形程式都能處理Exif資訊。

以上引自百度百科。

讀取照片的exif在很多時候都沒有必要,但相對於一些探討攝影技術的網站,那麼讀取照片的exif資訊就顯得尤為重要了,比如攝影論壇蜂鳥。

自蜂鳥論壇,紅圈資訊部分就是程式讀取照片的exif資訊。我們把圖片下載到本地,使用光影魔術手開啟圖片看看它的Exif資訊,當BG然除了光影還有很多工具都能查看圖片的Exif值。

除了Exif資訊裡的鏡頭值讀不出來以外其餘的值都能正確讀出來。

開啟PHP模組

預設情況下,PHP讀取圖片Exif資訊模組是不開啟的,我們需要先開啟這個模組。

開啟Exif模組需要mbstring支援,所以先來安裝mbstring,以下是以Linux環境為例,其它環境類似。

安裝mbstring模組

首先找到php源碼包位置,直接進入ext/mbstring,執行以下命令安裝,具體參數得看自己的環境。

複製代碼 代碼如下:
[root@lee ext]# cd /data0/software/php/ext/mbstring
[root@lee mbstring]# /usr/local/webserver/php/bin/phpize
Configuring for:
PHP Api Version: 20090626
Zend Module Api No: 20090626
Zend Extension Api No: 220090626
[root@lee exif]# ./configure --with-php-config=/usr/local/webserver/php/bin/php-config
[root@lee mbstring]# make && make install
Installing shared extensions: /usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20090626/
Installing header files: /usr/local/webserver/php/include/php/
[root@lee mbstring]#

安裝好以後,我們可以進入extensions目錄看看模組是否存在,存在表示安裝成功。
複製代碼 代碼如下:
[root@lee mbstring]# cd /usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20090626/
[root@lee no-debug-non-zts-20090626]# ll
總用量 1880
-rwxr-xr-x. 1 root root 414405 6月 12 2012 eaccelerator.so
-rwxr-xr-x. 1 root root 1091242 9月 23 2011 imagick.so
-rwxr-xr-x. 1 root root 5285 2月 20 15:07 mbstring.so
-rwxr-xr-x. 1 root root 246752 9月 23 2011 memcache.so
-rwxr-xr-x. 1 root root 154252 9月 23 2011 pdo_mysql.so

安裝exif模組

同安裝mbstring模組類似,先找到源碼位置並cd進去並配置安裝,具體參數得看自己的環境。
複製代碼 代碼如下:
[root@lee exif]# cd /data0/software/php-5.3.13/ext/exif
[root@lee exif]# ./configure --with-php-config=/usr/local/webserver/php/bin/php-config
[root@lee exif]# make && make install
Installing shared extensions: /usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20090626/
[root@lee exif]#

進入extensions目錄驗證是否安裝成功

複製代碼 代碼如下:
[root@lee exif]# cd /usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20090626/
[root@lee no-debug-non-zts-20090626]# ll
總用量 2036
-rwxr-xr-x. 1 root root 414405 6月 12 2012 eaccelerator.so
-rwxr-xr-x. 1 root root 158554 2月 20 15:25 exif.so
-rwxr-xr-x. 1 root root 1091242 9月 23 2011 imagick.so
-rwxr-xr-x. 1 root root 5285 2月 20 15:07 mbstring.so
-rwxr-xr-x. 1 root root 246752 9月 23 2011 memcache.so
-rwxr-xr-x. 1 root root 154252 9月 23 2011 pdo_mysql.so
[root@lee no-debug-non-zts-20090626]#

exif.so模組已經存在。

在php.ini中添加模組
開啟php.ini添加以下兩行
複製代碼 代碼如下:extension = "mbstring.so"
extension = "exif.so"

並且確認你的extension_dir值與你安裝模組時提示的Installing shared extensions值一致,比如我安裝模組時提示我的extensions位置是
複製代碼 代碼如下:/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20090626/
那麼你的php.ini裡的extension_dir要指向正確目錄
複製代碼 代碼如下:extension_dir="/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20090626/"
儲存php.ini,重啟webserver。
開啟phpinfo()找到相應屬性看看是否已正常工作

正常情況下你會看到如下兩個模組資訊

使用exif_read_data()讀取圖片的exif資訊

支援讀取exif資訊的圖片類型在phpinfo裡已經寫明了,只能是jpeg或者tiff類型,其中jpeg是常用類型,這就已經足夠。
我們來看看exif_read_data()函數的使用手冊
複製代碼 代碼如下:
array exif_read_data ( string $filename [, string $sections = NULL [, bool $arrays = false [, bool $thumbnail = false ]]] )

參數:

filename :要讀取圖片exif資訊的圖片路徑,這裡不能是URL
sections:是需要存在於檔案中的逗號分隔的區段列表用來產生結果數組。如果未找到所請求的區段則傳回值為 FALSE。

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

arrays :指定了是否每個區段都成為一個數組。sections COMPUTED,THUMBNAIL 和COMMENT 區段總是成為數組,因為它們裡麵包含的名字和其它區段衝突。

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

我們來讀取一張圖片的exif資訊試試
複製代碼 代碼如下:
<?php
$exif = getExif('a.jpg');
echo '

';
print_r($exif);
echo '
';

執行結果:
複製代碼 代碼如下:
Array
(
[FileName] => a.jpg
[FileDateTime] => 1361340032
[FileSize] => 69170
[FileType] => 2
[MimeType] => image/jpeg
[SectionsFound] => ANY_TAG, IFD0, THUMBNAIL, EXIF, GPS, INTEROP
[COMPUTED] => Array
(
[html] => width="600" height="397"
[Height] => 397
[Width] => 600
[IsColor] => 1
[ByteOrderMotorola] => 1
[ApertureFNumber] => f/13.0
[FocusDistance] => 3.76m
[UserComment] =>
[UserCommentEncoding] => ASCII
[Copyright] =>
[Thumbnail.FileType] => 2
[Thumbnail.MimeType] => image/jpeg
)
[ImageWidth] => 4928
[ImageLength] => 3264
[BitsPerSample] => Array
(
[0] => 8
[1] => 8
[2] => 8
)
[PhotometricInterpretation] => 2
[Make] => NIKON CORPORATION
[Model] => NIKON D7000
[Orientation] => 1
[SamplesPerPixel] => 3
[XResolution] => 3000000/10000
[YResolution] => 3000000/10000
[ResolutionUnit] => 2
[Software] => Adobe Photoshop CS5 Windows
[DateTime] => 2013:02:18 20:50:46
[WhitePoint] => Array
(
[0] => 313/1000
[1] => 329/1000
)
[PrimaryChromaticities] => Array
(
[0] => 64/100
[1] => 33/100
[2] => 21/100
[3] => 71/100
[4] => 15/100
[5] => 6/100
)
[YCbCrCoefficients] => Array
(
[0] => 299/1000
[1] => 587/1000
[2] => 114/1000
)
[YCbCrPositioning] => 2
[Copyright] =>
[Exif_IFD_Pointer] => 500
[GPS_IFD_Pointer] => 1248
[THUMBNAIL] => Array
(
[Compression] => 6
[XResolution] => 72/1
[YResolution] => 72/1
[ResolutionUnit] => 2
[JPEGInterchangeFormat] => 1362
[JPEGInterchangeFormatLength] => 4784
)
[ExposureTime] => 40/10
[FNumber] => 130/10
[ExposureProgram] => 1
[ISOSpeedRatings] => 1000
[UndefinedTag:0x8830] => 2
[ExifVersion] => 0230
[DateTimeOriginal] => 2013:02:14 21:12:08
[DateTimeDigitized] => 2013:02:14 21:12:08
[ComponentsConfiguration] =>
[CompressedBitsPerPixel] => 4/1
[ShutterSpeedValue] => -2/1
[ApertureValue] => 7400879/1000000
[ExposureBiasValue] => 2/6
[MaxApertureValue] => 36/10
[SubjectDistance] => 376/100
[MeteringMode] => 3
[LightSource] => 0
[Flash] => 16
[FocalLength] => 180/10
[UserComment] => ASCII
[SubSecTime] => 10
[SubSecTimeOriginal] => 10
[SubSecTimeDigitized] => 10
[FlashPixVersion] => 0100
[ColorSpace] => 65535
[ExifImageWidth] => 600
[ExifImageLength] => 397
[InteroperabilityOffset] => 1216
[SensingMethod] => 2
[FileSource] =>
[SceneType] =>
[CFAPattern] =>
[CustomRendered] => 0
[ExposureMode] => 1
[WhiteBalance] => 0
[DigitalZoomRatio] => 1/1
[FocalLengthIn35mmFilm] => 27
[SceneCaptureType] => 0
[GainControl] => 2
[Contrast] => 0
[Saturation] => 0
[Sharpness] => 0
[SubjectDistanceRange] => 0
[UndefinedTag:0xA500] => 22/10
[GPSVersion] =>
[InterOperabilityIndex] => R03
[InterOperabilityVersion] => 0100
)

如果提示:
複製代碼 代碼如下:
Fatal error: Call to undefined function exif_read_data() in /data0/htdocs/www/exif/index.php on line 2

則表示模組沒有開啟,可能是你配置哪一塊沒有配置好,重新設定就好。

從Exif資訊讀取結果中取出有用的資訊

從以上的執行結果我們發現圖片Exif很多,我們只需要從中過濾掉垃圾資訊剩下有用的就好。本例就以常用的參數為前提寫一個PHP函數。常用的參數包括快門,器材名稱,光圈,感光度,焦距:

複製代碼 代碼如下:
<?php
/**
* 讀取jpeg圖片的Exif資訊
* $img 為圖片路徑
*
* 瓊台部落格
*/

function getExif($img){

$exif = exif_read_data($img, 'IFD0');

return array (
'檔案名稱' => $exif['FileName'],
'器材品牌' => $exif['Make'],
'器材' => $exif['Model'],
'快門' => $exif['ExposureTime'],
'光圈' => $exif['FNumber'],
'焦距' => $exif['FocalLength'],
'感光度' => $exif['ISOSpeedRatings']
);

}

讀取照片

複製代碼 代碼如下:
<?php
$exifInfo = getExif('a.jpg');
echo '

';
print_r($exifInfo);
echo '
';

執行結果:
複製代碼 代碼如下:
Array
(
[檔案名稱] => 25556306.jpg
[器材品牌] => NIKON CORPORATION
[器材] => NIKON D3100
[快門] => 10/32000
[光圈] => 18/10
[焦距] => 350/10
[感光度] => 100
)

其它說明

圖片的Exif值是可以通過相應工具修改的,所以使用程式讀取圖片的Exif值只能用做參考,不做真實依據。

感興趣的朋友也可以訪問線上讀取Exif資訊網站http://exif.cn玩玩

通過PHP模組讀取的Exif資訊偶爾會錯,或者資訊不全,這種情況下,我們可以通過第三方工具。然後利用php執行系統linux命令讀取




http://www.bkjia.com/PHPjc/866676.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/866676.htmlTechArticlePHP中讀取照片exif資訊的方法, 先來瞭解什麼是圖片的Exif資訊 Exif是一種圖象檔案格式,它的資料存放區與JPEG格式是完全相同的。實際上Exi...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.