【发布时间】:2013-10-17 04:30:12
【问题描述】:
我正在使用 Imagick lib 对原始图像进行一些修改。然后我想直接输出到浏览器而不保存。有没有办法做到这一点?
我尝试使用 Imagick::writeImage('STDOUT')(空输出)和 'php://stdout',但出现错误“无法写入文件”。
有什么想法吗? :)
【问题讨论】:
我正在使用 Imagick lib 对原始图像进行一些修改。然后我想直接输出到浏览器而不保存。有没有办法做到这一点?
我尝试使用 Imagick::writeImage('STDOUT')(空输出)和 'php://stdout',但出现错误“无法写入文件”。
有什么想法吗? :)
【问题讨论】:
您只需要回显您的 imagick 对象:
$img = new Imagick($file);
header('Content-Type: image/'.$img->getImageFormat());
echo $img;
【讨论】:
header('Content-Type: image/'.$img->getImageFormat()); -- 但除此之外非常好:)
$img->__toString()获取其内容
我相信 Schneck 的意思是:
header('Content-Type: '.$mime_type);
$fp = fopen('php://stdout', 'w+');
$image->writeImageFile($fp);
fclose($fp);
这可能会导致问题,尤其是在多页文件中,因此您可能应该使用:
ob_start();
$fp = fopen('php://output', 'w+');
$image->writeimagefile($fp); // or writeImagesFile for multipage PDF
fclose($fp);
$out = ob_get_clean();
header('Content-Length: '.strlen($out));
echo $out;
这是经过测试和工作的。
我意识到这是一个老问题。我发布此内容的原因是,如果您想编写多页 PDF,这就是解决方案,因为 Nabab 的解决方案仅适用于单个图像。
你也可以使用(PHP 5.1.0+):
$fp = fopen('php://temp', 'r+');
$image->writeimagesfile($fp);
rewind($fp);
$out = stream_get_contents($fp);
header('Content-Length: '.strlen($out));
fclose($fp);
echo $out;
如果你的 PHP 版本支持,这种方式似乎更快。
在您投反对票之前,我将其添加为答案而不是评论的原因是我没有足够的声誉来发表评论。希望没关系。只是想把它拿出来以备不时之需。
【讨论】:
如果您使用 HHVM,如果您尝试回显 Imagick 对象,则会引发致命异常,因此您需要调用 getimageblob();
$imagick = new Imagick('my-image.jpg');
header('Content-Type: image/' . $imagick->getImageFormat());
echo $imagick->getimageblob();
【讨论】:
你试过Imagick::writeImageFile("php://stdout")(未经测试)吗?
【讨论】: