【问题标题】:Output raw image from Imagick image in PHP从 PHP 中的 Imagick 图像输出原始图像
【发布时间】:2013-10-17 04:30:12
【问题描述】:

我正在使用 Imagick lib 对原始图像进行一些修改。然后我想直接输出到浏览器而不保存。有没有办法做到这一点?

我尝试使用 Imagick::writeImage('STDOUT')(空输出)和 'php://stdout',但出现错误“无法写入文件”。

有什么想法吗? :)

【问题讨论】:

    标签: php stdout imagick


    【解决方案1】:

    您只需要回显您的 imagick 对象:

    $img = new Imagick($file);
    header('Content-Type: image/'.$img->getImageFormat());
    echo $img;
    

    【讨论】:

    • 我会选择header('Content-Type: image/'.$img->getImageFormat()); -- 但除此之外非常好:)
    • 如果由于某种原因不想回显图像,可以调用$img->__toString()获取其内容
    【解决方案2】:

    我相信 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 版本支持,这种方式似乎更快。

    在您投反对票之前,我将其添加为答案而不是评论的原因是我没有足够的声誉来发表评论。希望没关系。只是想把它拿出来以备不时之需。

    【讨论】:

      【解决方案3】:

      如果您使用 HHVM,如果您尝试回显 Imagick 对象,则会引发致命异常,因此您需要调用 getimageblob();

      $imagick = new Imagick('my-image.jpg');
      header('Content-Type: image/' . $imagick->getImageFormat());
      echo $imagick->getimageblob();
      

      【讨论】:

        【解决方案4】:

        你试过Imagick::writeImageFile("php://stdout")(未经测试)吗?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-05-06
          • 1970-01-01
          • 2010-12-29
          • 2013-11-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多