使用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'));
// 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信息相关推荐
- Java获取照片的Exif信息,并解析GPS
Java获取照片的Exif信息,并解析GPS 1. 效果图 2. 什么是Exif? 3. 源代码 参考 ❤️ 这篇博客将介绍什么EXIF,以及如何用Java语言读取Exif信息,并转换经纬度为位置信息 ...
- 获取图片的EXIF信息如此困难?
对于数码相机所拍摄出的图片,Exif信息非常重要.Exif是英语Exchangeable Image File(可交换图像文件)的缩写,最初由日本电子工业发展协会(JEIDA --Japan Elec ...
- php exif信息,php通过exif_read_data函数获取图片的exif信息
php获取图片的exif信息,php自带一个exif_read_data函数可以用来读取图片的exif信息,代码来自php手册 echo "test1.jpg: \n"; $exi ...
- JS获取图片的EXIF信息+纠正图片方向
前端图片处理碰到的一个离奇 bug , 关于图片的 EXIF 信息,特地记录下来 . 然后使用一下代码可以获取Orientation信息,并纠正Orientation带来的图片旋转问题 // from ...
- php exif信息,php通过exif_read_data函数获取图片的exif信息_php技巧
php获取图片的exif信息,php自带一个exif_read_data函数可以用来读取图片的exif信息,代码来自php手册 \n"; $exif = exif_read_data('te ...
- php exif信息,php通过exif_read_data函数获取图片的exif信息 PHP
php获取图片的exif信息,php自带一个exif_read_data函数可以用来读取图片的exif信息,代码来自php手册 echo 'test1.jpg: \n'; $exif = exif_r ...
- C# 获取图片的EXIF 信息
关于 EXIF 信息的介绍. 1 EXIF,是英文Exchangeable Image File(可交换图像文件)的缩写.EXIF是一种图像文件格式,只是文件的后缀名为jpg.EXIF信息是由数码相 ...
- 信息收集工具exiftool获取图片中的exif信息
简介 什么是exif信息呢. EXIF信息,是可交换图像文件的缩写,是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据.EXIF可以附加于JPEG.TIFF.RIFF等文件之中,为其增 ...
- 获取照片的EXIF信息
版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 背景概述 请利用Java编程技术获取手机拍摄的照片的EXIF信息,例如:拍摄时间.拍摄地点.经 ...
- 轻松获取图片和视频文件的Exif信息-Java篇
前言 随着现在实景地图的如火如荼建设,无人机等航拍测绘手段的不断升级,我们在获取全景照片或者正射影像,全景视频等数据上更加快速.便捷.由于无人机本身不进行相关数据的处理,比如全景地图的生成.视频的信息 ...
最新文章
- 细说Java主流日志工具库
- 深入理解WMS(一):Window的创建过程
- Linux系统命令常用查询
- 推荐一位资深 Python 大佬
- 如何提高一个研发团队的“代码速度”?
- debian 下修改boot停留时间
- 企业员工工资管理系统
- mysql 存储引擎版本_mysql不同版本和存储引擎选型的验证
- _系列 | 全自动泊车辅助F-APA简介(系列一)
- 前端性能优化的那些事
- 处理Linux中大量ESTABLISHED进程
- “ ModuleNotFoundError: No module named ‘tkinter‘ “的解决方法
- 【数据结构笔记23】C实现:表示图的多种方法(邻接矩阵、邻接表与相关拓展)
- 语言技巧——scanf读入多行字符串
- matlab的conv2、imfilter、filter2
- clion小白使用技巧(持续更新中)
- 使用jsBridge实现H5与原生App交互
- 步进电机控制(PLC)
- 备案修改域名服务器DNS,免备案域名的DNS改到dnspod教程详解
- 在线有道词典,又添新特色了!