使用 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 数据的主要内容,如果未能解决你的问题,请参考以下文章

无法将 gps 位置写入 exif

iOS Swift + Alamofire 上传带有 exif 数据的照片

web获取照片EXIF信息(例如:拍照方向相机设备型号拍摄时间ISO 感光度GPS 地理位置等数据)

web获取照片EXIF信息(例如:拍照方向相机设备型号拍摄时间ISO 感光度GPS 地理位置等数据)

Cordova 3.6:如何从 Android 的照片库中提取 GPS Exif 数据?

使用 C++ 修改 EXIF 数据