3

我正在使用 php Gmagick 来修改图像。以下代码按预期工作,只是图像不是渐进式的。为什么?根据GraphicsMagick 文档,它应该。作为参考,输入图像为 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

4 回答 4

2

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

->setInterlaceScheme(Gmagick::INTERLACE_LINE)

代替:

->setImageInterlaceScheme(Gmagick::INTERLACE_LINE)

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

于 2014-03-25T18:30:32.130 回答
0

您指向的文档指出:

使用Line创建隔行扫描的 PNGGIF渐进式 JPEG图像。

所以,我认为你应该将隔行设置为line.

->setImageInterlaceScheme(Gmagick::INTERLACE_LINE)

注意:我不确定是否INTERLACE_LINE是实际值。我认为它是基于您的代码。基本上,试试这个line选项。

于 2013-12-23T12:59:12.947 回答
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

于 2013-12-27T22:24:37.200 回答
0

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

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

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

我认为这对于“GMagick”来说是一样的

$im->setImageFormat('pjpeg')
于 2014-02-11T14:48:00.957 回答