【问题标题】:php convert.exe (ImageMagick) STDOUT passthru not workingphp convert.exe (ImageMagick) STDOUT passthru 不起作用
【发布时间】:2015-08-03 15:56:33
【问题描述】:

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

$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 如何发送到标准输出以及一般处理标准输出。

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

【问题讨论】:

  • 另外,如果我将输出文件名分配给 convert.exe 命令字符串(而不是 - ),则该操作将应用于文件,因此我知道该命令的语法是正确的。

标签: php stdout imagemagick-convert


【解决方案1】:

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

首先,您没有显示您正在运行的实际 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 是正确的。

【讨论】:

  • x.jpg 无法缩放,请记住:p - 您可能想要使用 tmpfile() ,这样会缩放
  • @hanshenrik 这不是为了扩展——它是在调试!
  • 写入文件与问题相反,即如何将结果图像通过标准输出而不是写入文件。
  • @DanielJordi 如果您仔细阅读我的回答,您会发现我并不是在暗示这是解决问题的方法——我的目的是通过指出什么来帮助找到解决方案当前出错了。
  • 啊。无论如何,使用 exec() 而不是 passthru() 我可以使用 ob 函数捕获发送到“-”的文本,但我不能用图像来做到这一点......其他问题表明 STDOUT 是一个可以回显的 php 资源直接,但我没有运气......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多