为什么setImageInterlaceScheme()不进行jpeg渐进式?

时间:2013-12-04 21:59:30

标签: pecl graphicsmagick gmagick

我正在使用php Gmagick来修改图片。以下代码按预期工作,但图像不是渐进的。为什么?根据{{​​3}}它应该。作为参考,输入图像为666 x 1000。

    $img = new Gmagick();
    $img->setSize(900, 900)
        ->readImageBlob($image->getBytes())
        ->setImageInterlaceScheme(Gmagick::INTERLACE_PLANE)
        ->setImageResolution(96, 96)
        ->setImageFormat('jpeg')
        ->setCompressionQuality(70)
        ->resizeImage(900, 1351, Gmagick::FILTER_UNDEFINED, 1);

请注意

$img->getImageInterlaceScheme() === Gmagick::INTERLACE_PLANE
设置后

返回true。

修改

我已尝试过INTERLACE_LINE和INTERLACE_PLANE常量。似乎都没有对输出产生影响。

4 个答案:

答案 0 :(得分:2)

原作者在php.net(https://bugs.php.net/bug.php?id=66444)上创建了一个错误,最终发布了正确答案。您需要使用未记录的方法:

->setInterlaceScheme(Gmagick::INTERLACE_LINE)

而不是:

->setImageInterlaceScheme(Gmagick::INTERLACE_LINE)

这对我有用!作为参考,我使用PHP 5.4.20和gmagick 1.1.7RC2在GraphicsMagick 1.3.18之上。

答案 1 :(得分:0)

您指出的文档说明:

  

使用线创建隔行扫描PNG GIF 渐进式JPEG 图像。

所以,我认为您应该将交错设置为line

->setImageInterlaceScheme(Gmagick::INTERLACE_LINE)

注意:我不确定INTERLACE_LINE是否为实际值。我以为它是基于你的代码。基本上,请尝试line选项。

答案 2 :(得分:0)

您之前是否尝试过调用setImageInterlaceScheme?我找不到代码,但也许当你读取它已经组成图像的位时,然后交错就没有了。

$img
    ->setImageInterlaceScheme(Gmagick::INTERLACE_PLANE)
    ->readImageBlob($image->getBytes())
    ->setSize(900, 900) 
    ->setImageResolution(96, 96)
    ->setImageFormat('jpeg')
    ->setCompressionQuality(70)
    ->resizeImage(900, 1351, Gmagick::FILTER_UNDEFINED, 1);

确保interlaceScheme必须是INTERLACE_PLANE,因为您可以阅读您已经知道的文档http://www.graphicsmagick.org/GraphicsMagick.html#details-interlace

答案 3 :(得分:0)

在经过数周的努力之后,我终于找到了答案(使用PHP IMagick)。

事实证明你必须将图像格式设置为'pjpeg',而不仅仅是jpeg。

我不知道为什么通过这样做我的图像被正确检测为渐进式并在浏览器中逐步呈现。

我认为这对'GMagick'来说是相同的

$im->setImageFormat('pjpeg')