如何在URL上使用Imagick的readImageFile时修复“检测到无效的CRT参数”错误?

时间:2012-06-14 01:30:25

标签: php windows imagemagick xampp imagick

我正在尝试通过Imagemagick做一个小型的图像处理类型项目来自学PHP。从基础开始,我写了一些简单的代码来读取图像并将其转换为PNG。

然而,虽然我能够从本地图像文件中读取,但我完全无法读取URL中的图像,因为当我在url上调用readImageFile()时它会崩溃,并且我收到以下错误:

  

致命错误:C:\ xampp \ htdocs \ imagepractice \ imagemagicktest.php中未捕获的异常'ImagickException',消息'检测到无效的CRT参数':8堆栈跟踪:#0 C:\ xampp \ htdocs \ imagepractice \ imagemagicktest。 php(8):Imagick-> readimagefile(资源ID#3)#8 {main}在第8行的C:\ xampp \ htdocs \ imagepractice \ imagemagicktest.php中抛出

我花了最后一小时用谷歌搜索来解决这个问题,无济于事,而我能找到的唯一领导是Error in using readImage function (Imagick)。但是,与该问题不同,我完全能够使用readImage,我甚至可以在本地文件上使用readImageFile,而不是在图像URL上。

从那里唯一的评论来看,似乎它可能是一个特定于Windows的错误,但我想知道是否有人碰巧能够确认/否认这个和/或建议一种方法来修复CRT参数错误?

作为参考,我写的代码如下:

<?php
$im = new Imagick();

//$im->newPseudoImage(1000, 1000, "magick:rose"); //this works!

//$im->readImage("images\\wheels.jpg"); // this works!

$handle = fopen("http://www.google.com/images/srpr/logo3w.png", "rb");
$im->readImageFile($handle); //this line crashes!
fclose($handle);

$im->setImageFormat("png");
$type = $im->getFormat();
header("Content-type: $type");
echo $im->getImageBlob();
?>

此外,我正在运行64位Windows 7,我正在使用XAMPP 1.7.7(使用PHP 5.3.8),我最初使用these instructions安装了Imagemagick 6.6.4。 (虽然我用Imagemagick 6.6.2替换了6.6.4版本,但是根据评论者here的建议,它没有修复任何东西。)

1 个答案:

答案 0 :(得分:0)

感谢一些友好的人在另一个编码论坛上,我终于想出了如何停止获取错误并使此代码正常工作。不幸的是,我仍然不确定导致CRT参数错误的原因是什么,但是从fopen切换到file_get_contents为我解决了这个问题。

更新代码:

<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL | E_STRICT);

$im = new Imagick();

//$im->newPseudoImage(1000, 1000, "magick:rose"); //this works!
//$im->readImage("images\\wheels.jpg"); //this works!

$url = "http://www.google.com/images/srpr/logo3w.png";
$source = @file_get_contents($url);
if(!$source){
    throw new Exception("failed to retrieve contents of $url");
}

$im->readImageBlob($source);

$im->setImageFormat("png");
$type = $im->getFormat();
header("Content-type: $type");
echo $im->getImageBlob();
?>

但是,根据论坛上的其他人的说法,我发布了这个,

  

使用curl,有些地方在PHP中禁用了allow_url_fopen。我使用XAMPP在我的Windows 7 64位机器上进行了一些开发,无论我在做什么,curl都可以正常工作。

所以为了安全起见,我可能会更改为使用curl而不是看看是否有效,但至少我现在已经解决了我的问题!