PHPで画像ファイルのEXIF情報を取得する

7822 ワード

私たちが撮った写真や各種の画像ファイルには、携帯電話で写真を撮るときにある位置情報、画像のタイプ、大きさなど、直感的に見ることができない情報が保存されています.これらの情報は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()関数が返す3番目の属性、すなわち下に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()の機能は類似しており、別名であり、PHP 7以降は古い構文としてマークされている.皆さん、ご理解ください.
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ではサムネイルを1つ保存できます.そして皆さんの携帯で撮った写真には基本的にこのサムネイルが存在します.Windowsシステムでは、画像にサムネイルがある場合はEXIFのサムネイルもそのまま使用する、なければ自動的にディレクトリにThumbsが生成される.dbファイル、すなわちサムネイルのデータベースです.
var_dump(exif_thumbnail('../img/3.jpeg'));
// string(14369) "�����

//                         !"$��@"���

// }!1AQa"q2��#B��R��$3br�
// %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz�������������������������������������������������������������������������

// w!1AQaq"2B����  #3R�br�
// $4�%�&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz��������������������������������������������������������������������������
//                                                                                                                           ?�b�������������?J�l�2

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�
//   �������~��+9����2V:+�о�Qn]�۲͐� ��U��nwF��w;f�h�k���i*w�bd+�D0�=\o��y����x\�,��BS��#/d�9���˓
//                                                                                             ,%C�3���eIZ~��������oLܰܡ~�}#�y:4Ӥ}�    ��dȻGI*Y��
//                                                                                                                                             ��m�)��x#a�6Jʈ7��ݪG�T&,� Ie�%�
  
//   ?��S���§�9��6s��8LT&o
//   Vn�Џ�R��c6��Ϝ p�G�f#��/�o����_�@�$�%#
//                                        � �Ҡ��5v��~����Ȣ)�ڽa�i�:���\�}��3xKM�CIe�����5&�/�� � R�+��He��}���b�Ґ�?
// ……
// ……
// ……

まとめ
画像のEXIFについて基本的に知っていることでしょう.今日の勉強で注意しなければならないのは、EXIFはJPG、TIFFのような画像フォーマットにしかありません.2つ目は修正可能です.3つ目は、この中にサムネイルが1枚保存されていることです.やはり、勉強は底なしの穴で、うっかりしてまた視野を広げてしまった.頑張れ、少年たち!
テストコード:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202011/source/11.PHPを用いる画像ファイルのEXIF情報を取得する.php
参照ドキュメント:
https://www.php.net/manual/zh/book.exif.php
https://baike.baidu.com/item/Exif/422825?fr=aladdin
http://www.360doc.com/content/13/0223/14/9290626_267432131.shtml
各メディアプラットフォームで検索可能【ハードコアプロジェクトマネージャ】