淺談怎麼利用PHP讀取到圖片的EXIF資訊(附代碼)
怎麼利用PHP讀取到圖片的EXIF資訊?以下這篇文章為大家介紹一下使用PHP取得影像檔案的EXIF資訊的方法,希望對大家有幫助!
在我們拍的照片以及各類圖像文件中,其實還保存著一些信息是無法直觀看到的,比如手機拍照時會有的位置信息,圖片的類型、大小等,這些資訊稱為EXIF 資訊。一般 JPG 、 TIFF 這類的圖片檔都會有這樣的資訊。 EXIF 其實就是專門為這種數位照片所客製化的,專門用來記錄數位照片的屬性資訊和拍攝資料的,最初由日本製定。這個其實很好理解,日本對相機產業基本上就是壟斷般的存在,所以這類的標準當然就是由他們來制定啦!
EXIF 在 Windows 系統中具有原生的支持,滑鼠右鍵點擊圖片開啟選單,然後點擊屬性並切換到詳細資訊就可以直接看到圖片檔案的 EXIF 資訊了。由於這些資訊是可以被隨意編輯的,所以它們可以作為一些參考,並不能作為某些功能屬性的確定值來獲取,例如寬高這些資訊就不要完全相信 EXIF 中的。
取得 EXIF 中的圖片類型資訊
首先,我們看下透過 EXIF 來查看圖片的類型。
var_dump(exif_imagetype($png)); // int(3) echo exif_imagetype($png) == IMAGETYPE_PNG ? $png . '是 PNG 图片' : $png . '不是 PNG 图片', PHP_EOL; // ../img/1.png是 PNG 图片 var_dump(exif_imagetype($jpg)); // int(2) echo exif_imagetype($jpg) == IMAGETYPE_JPEG ? $jpg . '是 jpg 图片' : $jpg . '不是 JPG 图片', PHP_EOL; // ../img/2.jpg是 jpg 图片
直接使用 exif_imagetype() 函數就會傳回圖片類型的常數,也就是以 IMAGETYPE_ 開頭的常數資訊所代表的圖片類型。它還包括其它許多類型,這裡只是演示了我們平常最常見的 jpg 和 png 類型的圖片類型的獲取。
它和getimagesize() 函數傳回的第三個屬性,也就是下標為2 的那個屬性的內容是一樣的,在getimagesize() 函數中,0 和1 代表的是寬高, 2 代表的就是圖片的類型。
var_dump(getimagesize($jpg)); // array(7) { // [0]=> // int(300) // [1]=> // int(244) // [2]=> // int(2) // [3]=> // string(24) "width="300" height="244"" // ["bits"]=> // int(8) // ["channels"]=> // int(3) // ["mime"]=> // string(10) "image/jpeg" // }
取得完整的 EXIF 資訊
圖片中完整的所有 EXIF 資訊是透過 exif_read_data() 函數來取得的。
var_dump(exif_read_data($png)); // PHP Warning: exif_read_data(1.png): File not supported in /Users/zhangyue/MyDoc/博客文章/dev-blog/php/202011/source/11.使用PHP获取图像文件的EXIF信息.php on line 14 // Warning: exif_read_data(1.png): File not supported in /Users/zhangyue/MyDoc/博客文章/dev-blog/php/202011/source/11.使用PHP获取图像文件的EXIF信息.php on line 14 // bool(false) var_dump(exif_read_data($jpg)); // array(8) { // ["FileName"]=> // string(5) "2.jpg" // ["FileDateTime"]=> // int(1605061174) // ["FileSize"]=> // int(19075) // ["FileType"]=> // int(2) // …… // ……
就像前面講過的,EXIF 資訊只在 JPG 、 TIFF 等類型的圖片格式中存在,所以 PNG 圖片是無法取得到 EXIF 資訊的。如果對 PNG 圖片使用 exif_read_data() 就會回報警告。而對於 JPG 來說,就會回到完整的全部的 EXIF 內容。這裡我們只截取了一部分,本身的內容非常多,不只是寬、高、類型、壓縮比率之類的,如果是手機拍攝的還能看到手機廠商、地理位置、快門參數、光圈參數等,當然,這個也和你使用的相機有很大的關係,有的廠商可能就會少一些數據。這個大家可以自己拍張照然後使用這個函數來自己檢查一下。
另外,還有一個別名函數 read_exif_data() ,與 exif_read_data() 的功能是類似的,就是它的一個別名,並且在 PHP7 以後就已經標記為過時的語法了。大家可以了解一下。
var_dump(read_exif_data($jpg)); // PHP Deprecated: Function read_exif_data() is deprecated in /Users/zhangyue/MyDoc/博客文章/dev-blog/php/202011/source/11.使用PHP获取图像文件的EXIF信息.php on line 17 // Deprecated: Function read_exif_data() is deprecated in /Users/zhangyue/MyDoc/博客文章/dev-blog/php/202011/source/11.使用PHP获取图像文件的EXIF信息.php on line 17 // array(8) { // ["FileName"]=> // string(5) "2.jpg" // ["FileDateTime"]=> // int(1605061174) // ["FileSize"]=> // …… // ……
取得指定索引的頭名稱
索引頭對應的就是 EXIF 中的欄位名稱,我們可以查看目前所有支援的索引頭信息,內容非常多。也可以根據索引頭取得屬性名稱,然後再到 EXIF 中尋找對應的屬性資訊。
echo "256: " . exif_tagname(256) . PHP_EOL; // 256: ImageWidth for ($id = 1; $id <= 65535; $id++) { if (exif_tagname($id) != "") { echo $id . ' ( ' . exif_tagname($id) . ' )', PHP_EOL; } } // 11 ( ACDComment ) // 254 ( NewSubFile ) // 255 ( SubFile ) // 256 ( ImageWidth ) // 257 ( ImageLength ) // 258 ( BitsPerSample ) // 259 ( Compression ) // …… // …… // ……
讀取 JPG 檔案中嵌入的縮圖
可能很多人不知道吧,EXIF 中是可以保存一個縮圖的。而且大家的手機拍出來的相片基本上都會有這個縮圖存在。 Windows 系統中如果圖片有縮圖的話也會直接用 EXIF 中的縮圖,如果沒有的話,就會自動在目錄中產生一個 Thumbs.db 文件,也就是一個縮圖的資料庫。
var_dump(exif_thumbnail('../img/3.jpeg')); file_put_contents('../img/3-thumbnail.jpeg', exif_thumbnail('../img/3.jpeg'));
在 PHP 中可以透過 exif_thumbnail() 這個函數直接取得 JPG 檔案中 EXIF 裡面保存的縮圖資訊。在測試程式碼中我們取得到後再將它儲存為正式的圖片,大家就可以看到縮圖的真實樣子了。而我們使用 exif_read_data() 來讀取這個檔案的話,也能看到縮圖保存的資訊。
var_dump(exif_read_data('../img/3.jpeg')); // array(56) { // …… // …… // …… // ["Make"]=> // string(6) "Xiaomi" // ["THUMBNAIL"]=> // array(9) { // ["JPEGInterchangeFormat"]=> // int(5504) // ["Orientation"]=> // int(6) // ["JPEGInterchangeFormatLength"]=> // int(14369) // ["Compression"]=> // int(6) // ["ResolutionUnit"]=> // int(2) // ["XResolution"]=> // string(4) "72/1" // ["YResolution"]=> // string(4) "72/1" // ["ExifImageLength"]=> // int(240) // ["ExifImageWidth"]=> // int(320) // } // ["UndefinedTag:0x9AAA"]=> // string(4480) "1y�L�=w%�s_�&��v��oJ��$Gdz|d�9n� // …… // ……
總結
對於圖片的 EXIF 有了一個基本的了解了吧。今天學習的需要注意的幾點是:一是 EXIF 只有 JPG 、 TIFF 這類的圖片格式上才有,二是它們是可修改的,三是這玩意裡面竟然還能保存一張縮圖。果然,學習就是個無底洞,一不小心又開了眼界了。加油吧,少年們!
測試程式碼:https://github.com/zhangyue0503/dev-blog/blob/master/php/202011/source/11.使用PHP取得圖片檔案的EXIF資訊.php
推薦學習:《PHP影片教學》
以上是淺談怎麼利用PHP讀取到圖片的EXIF資訊(附代碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP設置的關鍵在於明確安裝方式、配置php.ini、連接Web服務器及啟用必要擴展。 1.安裝PHP:Linux用apt、Mac用Homebrew、Windows推薦XAMPP;2.配置php.ini:調整錯誤報告、上傳限制等並重啟服務器;3.搭配Web服務器:Apache通過mod_php,Nginx使用PHP-FPM;4.安裝常用擴展:如mysqli、json、mbstring等以支持完整功能。

PHP註釋代碼常用方法有三種:1.單行註釋用//或#屏蔽一行代碼,推薦使用//;2.多行註釋用/.../包裹代碼塊,不可嵌套但可跨行;3.組合技巧註釋如用/if(){}/控制邏輯塊,或配合編輯器快捷鍵提升效率,使用時需注意閉合符號和避免嵌套。

寫好PHP註釋的關鍵在於明確目的與規範,註釋應解釋“為什麼”而非“做了什麼”,避免冗餘或過於簡單。 1.使用統一格式,如docblock(/*/)用於類、方法說明,提升可讀性與工具兼容性;2.強調邏輯背後的原因,如說明為何需手動輸出JS跳轉;3.在復雜代碼前添加總覽性說明,分步驟描述流程,幫助理解整體思路;4.合理使用TODO和FIXME標記待辦事項與問題,便於後續追踪與協作。好的註釋能降低溝通成本,提升代碼維護效率。

寫好註釋的關鍵在於說明“為什麼”而非僅“做了什麼”,提升代碼可讀性。 1.註釋應解釋邏輯原因,例如值選擇或處理方式背後的考量;2.對複雜邏輯使用段落式註釋,概括函數或算法的整體思路;3.定期維護註釋確保與代碼一致,避免誤導,必要時刪除過時內容;4.在審查代碼時同步檢查註釋,並通過文檔記錄公共邏輯以減少代碼註釋負擔。

易於效率,啟動啟動tingupalocalserverenverenvirestoolslikexamppandacodeeditorlikevscode.1)installxamppforapache,mysql,andphp.2)uscodeeditorforsyntaxssupport.3)

註釋不能馬虎是因為它要解釋代碼存在的原因而非功能,例如兼容老接口或第三方限制,否則看代碼的人只能靠猜。必須加註釋的地方包括複雜的條件判斷、特殊的錯誤處理邏輯、臨時繞過的限制。寫註釋更實用的方法是根據場景選擇單行註釋或塊註釋,函數、類、文件開頭用文檔塊註釋說明參數與返回值,並保持註釋更新,對複雜邏輯可在前面加一行概括整體意圖,同時不要用註釋封存代碼而應使用版本控制工具。

ToinstallPHPquickly,useXAMPPonWindowsorHomebrewonmacOS.1.OnWindows,downloadandinstallXAMPP,selectcomponents,startApache,andplacefilesinhtdocs.2.Alternatively,manuallyinstallPHPfromphp.netandsetupaserverlikeApache.3.OnmacOS,installHomebrew,thenrun'bre

PHPblockcommentsareusefulforwritingmulti-lineexplanations,temporarilydisablingcode,andgeneratingdocumentation.Theyshouldnotbenestedorleftunclosed.BlockcommentshelpindocumentingfunctionswithPHPDoc,whichtoolslikePhpStormuseforauto-completionanderrorche
