使用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'));
// string(14369) "�����//                         !"$��@"���// }!1AQa"q2��#B��R��$3br�
// %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz�������������������������������������������������������������������������// w!1AQaq"2B����  #3R�br�
// $4�%�&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz��������������������������������������������������������������������������
//                                                                                                                           ?�b�������������?J�l�2file_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

使用PHP获取图像文件的EXIF信息相关推荐

  1. Java获取照片的Exif信息,并解析GPS

    Java获取照片的Exif信息,并解析GPS 1. 效果图 2. 什么是Exif? 3. 源代码 参考 ❤️ 这篇博客将介绍什么EXIF,以及如何用Java语言读取Exif信息,并转换经纬度为位置信息 ...

  2. 获取图片的EXIF信息如此困难?

    对于数码相机所拍摄出的图片,Exif信息非常重要.Exif是英语Exchangeable Image File(可交换图像文件)的缩写,最初由日本电子工业发展协会(JEIDA --Japan Elec ...

  3. php exif信息,php通过exif_read_data函数获取图片的exif信息

    php获取图片的exif信息,php自带一个exif_read_data函数可以用来读取图片的exif信息,代码来自php手册 echo "test1.jpg: \n"; $exi ...

  4. JS获取图片的EXIF信息+纠正图片方向

    前端图片处理碰到的一个离奇 bug , 关于图片的 EXIF 信息,特地记录下来 . 然后使用一下代码可以获取Orientation信息,并纠正Orientation带来的图片旋转问题 // from ...

  5. php exif信息,php通过exif_read_data函数获取图片的exif信息_php技巧

    php获取图片的exif信息,php自带一个exif_read_data函数可以用来读取图片的exif信息,代码来自php手册 \n"; $exif = exif_read_data('te ...

  6. php exif信息,php通过exif_read_data函数获取图片的exif信息 PHP

    php获取图片的exif信息,php自带一个exif_read_data函数可以用来读取图片的exif信息,代码来自php手册 echo 'test1.jpg: \n'; $exif = exif_r ...

  7. C# 获取图片的EXIF 信息

    关于 EXIF 信息的介绍. 1  EXIF,是英文Exchangeable Image File(可交换图像文件)的缩写.EXIF是一种图像文件格式,只是文件的后缀名为jpg.EXIF信息是由数码相 ...

  8. 信息收集工具exiftool获取图片中的exif信息

    简介 什么是exif信息呢. EXIF信息,是可交换图像文件的缩写,是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据.EXIF可以附加于JPEG.TIFF.RIFF等文件之中,为其增 ...

  9. 获取照片的EXIF信息

    版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 背景概述 请利用Java编程技术获取手机拍摄的照片的EXIF信息,例如:拍摄时间.拍摄地点.经 ...

  10. 轻松获取图片和视频文件的Exif信息-Java篇

    前言 随着现在实景地图的如火如荼建设,无人机等航拍测绘手段的不断升级,我们在获取全景照片或者正射影像,全景视频等数据上更加快速.便捷.由于无人机本身不进行相关数据的处理,比如全景地图的生成.视频的信息 ...

最新文章

  1. 细说Java主流日志工具库
  2. 深入理解WMS(一):Window的创建过程
  3. Linux系统命令常用查询
  4. 推荐一位资深 Python 大佬
  5. 如何提高一个研发团队的“代码速度”?
  6. debian 下修改boot停留时间
  7. 企业员工工资管理系统
  8. mysql 存储引擎版本_mysql不同版本和存储引擎选型的验证
  9. _系列 | 全自动泊车辅助F-APA简介(系列一)
  10. 前端性能优化的那些事
  11. 处理Linux中大量ESTABLISHED进程
  12. “ ModuleNotFoundError: No module named ‘tkinter‘ “的解决方法
  13. 【数据结构笔记23】C实现:表示图的多种方法(邻接矩阵、邻接表与相关拓展)
  14. 语言技巧——scanf读入多行字符串
  15. matlab的conv2、imfilter、filter2
  16. clion小白使用技巧(持续更新中)
  17. 使用jsBridge实现H5与原生App交互
  18. 步进电机控制(PLC)
  19. 备案修改域名服务器DNS,免备案域名的DNS改到dnspod教程详解
  20. 在线有道词典,又添新特色了!

热门文章

  1. 《运动改造大脑》总结
  2. java中实现注册时Email邮件激活验证
  3. TeamTalk的windows客户端流程
  4. 你走后 爱情的遗址像是空城
  5. c语言中sys是什么文件夹,windows系统中C盘的pagefile.sys是什么文件
  6. 【计算机基础】思维导图
  7. 树莓派——槑槑智能音箱
  8. 史上最简单的word文档docx文档解密方法,忘记word文档docx密码怎么办?
  9. js仿百度文库文档上传页面的分类选择器_第二版
  10. switch语句应用例题