0

似乎 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 个无关字节

怎么了?

4

1 回答 1

1

2019 年 1 月 30 日报告了 PHP 错误 #77546 :

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

这会影响 PHP 版本 7.3.0、7.3.1 和 7.3.2。
已发布补丁在 PHP 7.3.3中修复了该错误

[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 严重错误警告,它提供了这种检测图像损坏的方法:

// 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;
于 2020-03-21T00:54:33.550 回答