关于php:使用PHP获取图像文件的EXIF信息

36次阅读

共计 4801 个字符,预计需要花费 13 分钟才能阅读完成。

在咱们拍的照片以及各类图像文件中,其实还保留着一些信息是无奈直观看到的,比方手机拍照时会有的地位信息,图片的类型、大小等,这些信息就称为 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'));
// 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<���2�z�B3���2�Ol*8
//           w       W�"E�c���OV�l9����                                                                                                                                        p�f�����KAFUg���<I���ʯ9E�S�
//   ����U�ޘ�CO�>ʈ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 这类的图片格式上才有,二是它们是可批改的,三是这玩意外面居然还能保留一张缩略图。果然,学习就是个无底洞,一不小心又开了眼界了。加油吧,少年们!

测试代码:

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

各自媒体平台均可搜寻【硬核项目经理】

正文完
 0