有没有一种有效的方法来检测jpeg文件是否已损坏?
背景信息:
解决方案需要在php脚本
中工作jpeg文件在磁盘上
手动检查是没有选项(用户上传的数据)
我知道imagecreatefromjpeg(string $filename);
可以做到.但这样做很慢.
有人知道更快/更有效的解决方案吗?
从命令行,您可以使用jpeginfo来查明jpeg文件是否正常.
$ jpeginfo -c test.jpeg
test.jpeg 260 x 264 24bit JFIF N 15332 [确定]
从php调用jpeginfo应该是微不足道的.
我最简单(也是最快)的解决方案:
function jpeg_file_is_complete($path) { if (!is_resource($file = fopen($path, 'rb'))) { return FALSE; } // check for the existence of the EOI segment header at the end of the file if (0 !== fseek($file, -2, SEEK_END) || "\xFF\xD9" !== fread($file, 2)) { fclose($file); return FALSE; } fclose($file); return TRUE; } function jpeg_file_is_corrupted($path) { return !jpeg_file_is_complete($path); }
注意:这仅检测损坏的文件结构,但不检测损坏的图像数据.
仅供参考 - 我使用上面的方法(jpeg_file_is_complete
)来测试我知道已损坏的JPEG(当我在浏览器中加载它们时,例如,底部是灰色的 - 即图像被"切断").无论如何,当我在该图像上运行上述测试时,它不会将其检测为损坏.
到目前为止,使用imagecreatefromjpeg()
作品,但不是很快.我发现使用jpeginfo
也可以检测这些类型的损坏图像,并且比imagecreatefromjpeg
我在PHP中运行基准测试更快microtime()
.