IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> 使用PHP获取图像文件的EXIF信息 -> 正文阅读

[PHP知识库]使用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�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

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-07-28 07:27:14  更:2021-07-28 07:30:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 5:25:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码