使用 PHP 删除 GPS EXIF 数据
Posted
技术标签:
【中文标题】使用 PHP 删除 GPS EXIF 数据【英文标题】:Removing GPS EXIF data with PHP 【发布时间】:2011-07-22 01:18:23 【问题描述】:今天早上,我被一个运行 Concrete5 网站的客户打来的电话叫醒,他说上传到他们网站的所有图片突然停止工作。经过一两个小时的实验和研究,我意识到了问题的根本原因。几天前,这个客户得到了一部新手机(三星 Epic),它记录了每张图像的 GPS EXIF 数据。她将这部手机用作她的相机,无论出于何种原因,如果图像中有任何 GPS 数据,Concrete5 就会爆炸。我怀疑这是因为 GPS 数据存储为数组而不是字符串。
如果 GPS EXIF 数据存在,我一直在尝试使用通用函数来删除任何 EXIF 数据。这是我目前所拥有的(位于tools/files/importers
内):
$fileExtension = strtolower(substr($_FILES['Filedata']['name'], strrpos($_FILES['Filedata']['name'], '.')));
if ($fileExtension == ".jpg" || $fileExtension == ".jpeg")
/* File is a JPEG */
if (exif_read_data($_FILES['Filedata']['tmp_name'], 'GPS') !== false)
/* File contains GPS EXIF data */
if (extension_loaded('magickwand') && function_exists("NewMagickWand"))
/* ImageMagick is installed and working */
$img = new Imagick($_FILES['Filedata']['tmp_name']);
$img->stripImage();
$img->writeImage($_FILES['Filedata']['tmp_name']);
$img->clear();
elseif (extension_loaded('gd') && function_exists('gd_info'))
/* GD is installed and working */
$img = imagecreatefromjpeg($_FILES['Filedata']['tmp_name']);
imagejpeg ($img, $_FILES['Filedata']['tmp_name']);
else
/* Neither ImageMagick nor GD are installed */
die('No appropriate image handler to remove EXIF data');
即使有这段代码,当我上传图片时,EXIF 数据仍然存在。我尝试在整个代码中放置die()
命令,以准确确定代码所采用的路径。在这个特定的服务器上,我从不输入if (extension_loaded('magickwand') && function_exists("NewMagickWand"))
块,但是我确实输入了elseif (extension_loaded('gd') && function_exists('gd_info'))
块。因此,我的 ImageMagick 代码可能还不错,但似乎 GD 没有正确删除 EXIF 数据。
有人有使用 ImageMagick/GD 或 php 和 EXIF 数据的经验吗?
【问题讨论】:
如果您认为这是 concopy5 的问题,您应该向混凝土人发送一些破坏他们软件的示例图像并报告问题,以便在主软件中修复。 我做到了。我在 IRC 上花了大半天的时间,但我希望今天解决这个问题,而不是等待一个月的更新。 是的,无论如何首先需要修复。 【参考方案1】:我在我的本地机器上运行了一个测试,试图按照你的方法去除 EXIF 数据,它成功了~它确实添加了这个评论数据: 创建者:gd-jpeg v1.0(使用 IJG JPEG v80),质量 = 100
您使用的是什么版本的 gd-jpeg?
另外,您是否尝试过 var_dump
将您的电话呼叫至 imagejpeg
?它可能会失败~我从来没有很幸运地写过任何服务器的/tmp
文件夹。也许你应该在你的 webroot 下设置目标文件。
【讨论】:
我的GD版本是bundled (2.0.34 compatible)
。我尝试用imagejpeg ($img, "test.jpg");
替换imagejpeg ($img, $_FILES['Filedata']['tmp_name']);
以查看实际生成的图像(处理导入的脚本从未显示-它是一个AJAX 上传器)但从未创建test.jpg
。我还尝试将var_dump($img)
打印到文件中,但它绝对是空白的。我应该试试var_dump(imagejpeg ($img))
吗?
对此的快速补充——我尝试了if($img === false) fwrite($fp, 'img is false');
(当然$fp
是一个指向我用来监视输出的文件的文件指针)并且确实$img
被设置为false。 php.net/manual/en/function.imagecreatefromjpeg.php 表示“错误”返回 false,但没有指定哪种类型的错误会导致这种情况。有什么想法吗?
@steven 对我来说听起来像是写权限。我建议将文件从 tmp_name
复制到您知道您具有写入权限的地方,然后在您刚刚创建的文件上运行您的进程(一路调试每个步骤);我将继续验证 $img
是有效资源,并另外捕获对 imagejpeg (
的调用的返回,因为它也可能是错误的 =)
我将$_FILES['Filedata']['tmp_name']
复制到test.jpg
(在我有rwx 权限的文件夹中)并且文件复制得很好,但imagecreatefromjpeg()
仍然返回false。我敢肯定,只要$img
为假,imagejpeg()
也将返回假。还有其他想法吗?看起来 GD 似乎被简单地破坏了,但 Concrete5 使用 GD 来生成缩略图。我的 GD 版本是否无法解析带有 GPS EXIF 数据的图像(解释 C5 失败的原因)?
@Steven,天哪...你打开错误报告了吗? ini_set('display_errors',1)
(如果您仍然通过 AJAX 执行此操作,我建议您切换到直接访问文件,以便查看所有输出。)您的理论对我来说听起来最合理。以上是关于使用 PHP 删除 GPS EXIF 数据的主要内容,如果未能解决你的问题,请参考以下文章
iOS Swift + Alamofire 上传带有 exif 数据的照片
web获取照片EXIF信息(例如:拍照方向相机设备型号拍摄时间ISO 感光度GPS 地理位置等数据)
web获取照片EXIF信息(例如:拍照方向相机设备型号拍摄时间ISO 感光度GPS 地理位置等数据)