2013-04-02 27 views
3
获取图片

我正在尝试使用ImageMagick进行一些照片操作(当前为裁剪)。我以前用PHP的GD库(在我的本地主机上)取得了预期的结果,但现在主机不支持它,他们建议我改用ImageMagick。问题是,我可以裁剪图像,它是存储在本地:PHP ImageMagick从http

<?php 
$four = '4fingers1.jpg'; 
exec("convert $four -crop 100x100+100+100 test.jpg"); 
?> 
<img src="test.jpg"> 

没有问题,但是当它来自HTTP源(我的剧本的实际目的)我没有收到图像。该代码如下(我用后一种形式的图像的实际SRC):

$src = $_POST['src']; 
exec("convert $src -resize 720x720 resized.jpg"); // this is specified in the documentation 
exec("convert resized.jpg -crop 100x100+100+100 final.jpg"); 
?> 
<img src="final.jpg"> <!-- no image --> 
<img src="resized.jpg"> <!-- no image --> 
<img src="<?php echo $src; ?>"> <!-- alright --> 

文档指定以下内容:

IM can also download an image that is published on the 'world wide web' by specifying that images URL. This basically provides a 'http:' image coder, which is why it works.

链接:http://www.imagemagick.org/Usage/files/#read

我试着大量的代码片段在网上创建,无法弄清楚为什么不工作?我可以使用其他的东西来达到我的目的?

+4

要小心你的$ _POST ['src']'&'exec'。 – Prisoner

+0

我已经搜索了其他解决方案,但似乎并不适合我的需要,我知道... –

回答

0

首先我和乔恩和答案囚徒的评论。你必须使用escapeshellarg()逃脱$ SRC POST变种从shell命令注入,以防止:

$src = escapeshellarg($_POST); 

而且你应该使用第二个参数(命令的输出)和第三个参数(命令的返回值)和尊重它。

呼叫exec()这样的:

exec("convert $src -resize 720x720 resized.jpg 2>&1", $output, $returnval); 

if($returnval !== 0) { 
    die('imagemagick error: ' . join("<br/>", $output)); 
} 

现在你可以对错误的反应,你可以看到什么错。请注意,我已将imagemagick stderr重定向到使用shell重定向的标准输出(2>&1

+0

首先感谢您的及时回复。我已经遵循了关于'escapeshellarg'的建议,不幸的是我收到以下错误:'imagemagick error:Array'。这是什么意思?我必须迭代它来找到错误值/代码或类似的东西? –

+0

对不起,我的错! ;)我错过了$输出将是一个行数组。检查我的更新 – hek2mgl

+0

没问题,你的帮助很棒。好的一面是数组部分已经消失,但不好的一面是,现在我只接收'imagemagick错误:'...我可以尝试乔恩处理临时文件的建议,也许这可能有所帮助? –

3

首先,作为囚徒comments这段代码容易受壳参数的影响。基本上任何人都可以操纵后期参数,并让你执行任何他们想要的命令行; 这可能是灾难性的,应立即解决!

解决安全问题的一种方法是使用escapeshellarg;这也应该解决你的“原始”问题,因为命令没有明显的原因失败。如果URL有效并且参数已正确转义,则它应该可以正常工作。

或者,您也可以同时解决安全性头痛和自己下载的图像,并呼吁IM之前将其保存到一个临时文件,原来的问题:

$temp = tempnam(sys_get_temp_dir()); 
file_put_contents($temp, file_get_contents($url)); 

exec("convert ".escapeshellarg($temp)." -crop 100x100+100+100 test.jpg"); 
+0

关于保存到临时文件的好例子。这是我真正需要的东西。谢谢。我会尝试! –

0

问题是IM在我的情况下对https协议有问题。我曾与一个HTTP图像测试,一切工作正常,所以我做了如下:

<?php 
$src = $_POST['src']; 
$src = preg_replace('/^https\:\/\//', 'http://', $src); 
$src = escapeshellarg($src); 
exec('convert ' . $src . ' resized.jpg 2>&1', $output, $returnval); 
if($returnval !== 0) { 
    die('imagemagick error: ' . join("<br/>", $output)); 
} 
?> 
<img src="resized.jpg"> 

我现在所显示的图像,我可以开始裁剪等。

+0

是不是,该网站正在使用导致问题的不可信证书? – hek2mgl

+0

我没有意识到这一点,但它可能是我的情况下的问题,我没有尝试与其他https图像。 –