我正在尝试从命令行使用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专家在那里看到任何明显的东西?
答案 0 :(得分:0)
一些应该有帮助的事情......
首先,您不会显示正在运行的实际ImageMagick命令 - 这将有助于人们帮助您!
其次,在创建$cmd
时,您需要在文件名前加一个空格。
第三,您在将文件增加5%之前告诉浏览器文件的大小,以便您有时会切断图像的底部!
第四,你告诉浏览器该文件是Content-Type: image/jpeg
,实际上它只是与输入文件的格式完全相同,可能是PNG
或GIF
, 例如。如果您不打算检查输入文件类型并相应地设置Content-Type
,则应修改ImageMagick
命令以在最后写入jpg:-
而不是-
它输出JPEG
而不是像现在那样简单地镜像输入文件类型。
第五,你的图像正确显示,除了文件开头有换行符 - 我不知道为什么会这样 - 可能与echo
有关。我将您的代码更改为只写$out
而没有标题,并将输出重定向到文件中,然后我这样做去除第一个字节:
phptest > x.jpg
dd if=x.jpg bs=1 iseek=1 > y.jpg
,生成的文件y.jpg
是正确的。