【问题标题】:iptcembed() corrupts JPG dataiptcembed() 损坏 JPG 数据
【发布时间】:2020-03-21 00:54:33
【问题描述】:

似乎 PHP 的 iptcembed() 函数损坏了 JPG 文件。
此演示提取 IPTC 数据并立即再次嵌入:

// extract IPTC data
getimagesize($sourceFile,$info);
$iptcData = $info['APP13'];

// embed IPTC data
$newFile = iptcembed($iptcData,$sourceFile);

// write new file to disk
$fp = fopen($sourceFile,"w");
fwrite($fp,newFile);
fclose($fp);

// get size of file
$size = getimagesize($sourceFile,$info);

警告:getimagesize():损坏的 JPEG 数据:在第 XX 行的 example.php 中的标记之前有 1382 个无关字节

怎么了?

【问题讨论】:

    标签: php metadata jpeg php-7.3 iptc


    【解决方案1】:

    PHP bug #77546 于 2019 年 1 月 30 日报告:

    在 php 7.3 分支上,有时流无效

    这会影响 PHP 版本 7.3.0、7.3.1 和 7.3.2。
    发布了 patch 并且 该错误是 PHP 7.3.3 中的 fixed

    [2019-02-08 09:40 UTC] nikic@php.net
    此更改将成为 PHP 7.3.3 的一部分。

    我已验证 PHP 7.2 或 7.4 中不存在该错误。


    还提供了一个临时解决方案:

    [2019-02-08 05:06 UTC] gmail dot com 上的 imagevuex
    临时解决办法,在写入文件前用getimagesizefromstring()检查图片流是否有效:

    $content = iptcembed($iptc, $file,0);
    if($content && @getimagesizefromstring($content)) // is valid
    

    另请参阅PHP 7.3 Critical Bug Warning,它提供了这种检测图像损坏的方法:

    // PHP 7.3 bug https://bugs.php.net/bug.php?id=77546
    // detect if image is corrupt before writing
    if(
        version_compare(PHP_VERSION, '7.3') >= 0 && 
        version_compare(PHP_VERSION, '7.3.3') < 0 && 
        !@getimagesizefromstring($content)
    ) return;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-11
      • 2018-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-08
      相关资源
      最近更新 更多