【发布时间】:2017-08-18 10:40:51
【问题描述】:
正如人们已经发现的那样,当尝试将一个文件加载到 Imagick 中时,无论出于何种原因它都无法处理,它会抛出一个无法捕获的异常。
我创建了一个 ICO 文件并尝试使用 readImageFile() 加载它:
$image = new imagick();
$handle = fopen('icon.ico', 'rb');
$image->readImageFile($handle);
这会抛出:
PHP Fatal error: Uncaught exception 'ImagickException' with message 'no decode delegate for this image format `' @ error/constitute.c/ReadImage/501'
当我指定图像将是一个 ICO 文件时,它可以工作。所以这段代码运行良好:
$image = new imagick();
$image->setFormat('ICO');
$handle = fopen('icon.ico', 'rb');
$image->readImageFile($handle);
使用readFile而不是readImageFile,显然是看扩展名,因为这段代码也运行良好:
$image = new imagick();
$image->readimage('icon.ico');
但是,当我将 ICO 文件重命名为 icon.jpg 并运行时:
$image = new imagick();
$image->readimage('icon.jpg');
它失败并出现以下错误:
PHP Fatal error: Uncaught exception 'ImagickException' with message 'Not a JPEG file: starts with 0x00 0x00 `icon.jpg' @ error/jpeg.c/JPEGErrorHandler/322'
但是,以下代码可以很好地处理重命名为 icon.jpg 的 ICO 文件:
$image = new imagick();
$image->setFormat('ICO');
$handle = fopen('icon.jpg', 'rb');
$image->readImageFile($handle);
显然,处理图像的最佳方法是不查看扩展名(可能是任何内容),而是查看实际文件。 Imagick 显然没有做到这一点。我们有 PHP 函数,例如 mime_content_type()、getimagesize() 和 finfo_buffer()(我认为 PHP.net 建议使用这些函数)。但它们会返回类似“image/x-icon”的东西,setFormat() 函数不会接受。
最好的方法是什么?
【问题讨论】:
标签: php imagemagick imagick