php convert.exe(ImageMagick)STDOUT passthru无法正常工作

时间:2015-08-03 15:56:34

标签: php stdout imagemagick-convert

我正在尝试从命令行使用imagemagick(在php中,是的,我知道我可以使用imagemagick函数,但这不是一个选项)而不保存到最终文件,只是将最终图像读取到stdout 。这是我的代码:

$filename = <filepathandname>;
$cmd = IMCMD. $filename . " -resize 105% -";

header('Content-Disposition: inline; filename="'.$filename.'"');
header('Content-Type: application/octet-stream');
header('Content-Length: '.filesize($filename));
header('Content-Type: image/jpeg');
//from here to end returns an empty image
ob_start();
passthru($cmd, $result); 
$out = ob_get_contents();
ob_end_clean();
echo ($out);
//end
//readfile($filename); //otherwise this works fine
exit();

我得到的是一个空图像(0字节)。我已经尝试了很多来自本网站上的问题的其他组合,比如简单地回应STDOUT等等,但我认为真正的问题是我不太了解convert.exe如何发送到stdout,以及一般处理stdout。

任何php / convert.exe专家在那里看到任何明显的东西?

1 个答案:

答案 0 :(得分:0)

一些应该有帮助的事情......

首先,您不会显示正在运行的实际ImageMagick命令 - 这将有助于人们帮助您!

其次,在创建$cmd时,您需要在文件名前加一个空格。

第三,您在将文件增加5%之前告诉浏览器文件的大小,以便您有时会切断图像的底部!

第四,你告诉浏览器该文件是Content-Type: image/jpeg,实际上它只是与输入文件的格式完全相同,可能是PNGGIF , 例如。如果您不打算检查输入文件类型并相应地设置Content-Type,则应修改ImageMagick命令以在最后写入jpg:-而不是-它输出JPEG而不是像现在那样简单地镜像输入文件类型。

第五,你的图像正确显示,除了文件开头有换行符 - 我不知道为什么会这样 - 可能与echo有关。我将您的代码更改为只写$out而没有标题,并将输出重定向到文件中,然后我这样做去除第一个字节:

phptest > x.jpg
dd if=x.jpg bs=1 iseek=1 > y.jpg

,生成的文件y.jpg是正确的。