当文件大小大于 2mb 时,Imagick 无法调整 GIF 图像的大小

Posted

技术标签:

【中文标题】当文件大小大于 2mb 时,Imagick 无法调整 GIF 图像的大小【英文标题】:Imagick fails resizing GIF images when file size is larger than 2mb 【发布时间】:2018-06-21 04:24:49 【问题描述】:

我正在使用 Imagick php 扩展来将 GIF 图像调整为多种尺寸。当我尝试使用 3mb 大小的 GIF 图像时,它不会调整大小。但是对于小于 1mb 的图像,它们会成功调整大小。

如果有其他人遇到过这个问题,请指教!

这是我的代码

if ($extension === 'gif') 
    $imagick =  new Imagick($_FILES['file']['tmp_name']);

    foreach ($imageFolders as $imageFolder => $size) 

        if ($imagick->getImageWidth() > $size['minWidth']) 
            $width = $size['maxWidth'];
            $height = $size['maxWidth'];
         else 
            $width = $imagick->getImageWidth();
            $height = $imagick->getImageHeight();

        

        $imagick->coalesceImages();

        do 
            $imagick->scaleImage($width, $height, Imagick::FILTER_BOX, 1);
         while ($imagick->nextImage());

        $imagick = $imagick->deconstructImages();
        $imagick->writeImages($imagePath, true);

    

    $imagick->clear();
    $imagick->destroy();


结果:转换列表资源

File         Area       Memory          Map         Disk    Thread         Time
-------------------------------------------------------------------------------
 768      7.951GB    3.7025GiB    7.4049GiB    unlimited         2    unlimited

【问题讨论】:

请显示您的命令?你的 Imagemagick 是什么版本?输入图像尺寸和调整后的尺寸是多少? Imagemagick policy.xml 文件中有哪些限制?你得到什么错误信息?您可以在 Imagemagick 命令行中进行相同的调整大小吗?那样有用吗?也许服务器对输入或输出文件的大小进行了限制? @fmw42 我已经更新了这个问题。我没有使用命令,我使用的是 imagick php 代码。 myserver 允许的 mx_upload_filesize 是 300m。我没有使用 imagemagicpolicy.xml?我需要将它与 php pls 建议一起使用吗 你确定upload_max_filesize 300M听起来很多,我的服务器限制是2M。 post_max_size 设置为多少? php.net/manual/en/imagick.coalesceimages.php#Hcom110393 这似乎有你需要的一切 @user3647971 我用了同样的方法。但在我的系统上,每个图像都必须根据来自 foreach 循环的宽度/高度调整为 6 种不同的尺寸。当我尝试上传一个大小为 3mb 的文件时,它要么调整为一种大小,而其他大小不会生成,否则不会生成调整大小的大小 【参考方案1】:
$imagick =  new Imagick($_FILES['file']['tmp_name']);

foreach ($imageFolders as $imageFolder => $size) 

    if ($imagick->getImageWidth() > $size['minWidth']) 
        $width = $size['maxWidth'];
        $height = $size['maxWidth'];
     else 
        $width = $imagick->getImageWidth();
        $height = $imagick->getImageHeight(
    

    $imagick = $imagick->coalesceImages();

    foreach($imagick as $frame)
        $frame->thumbnailImage($width , $height ); 
        $frame->setImagePage($width , $height , 0, 0); 
    

    $imagick = $imagick->deconstructImages();
    $imagick->writeImages($imagePath, true);



$imagick->clear();
$imagick->destroy();

【讨论】:

我尝试过这种方式,我可以调整大小并上传 7mb 图像。但是当我检查调整大小的图像时,其中一些没有完全相同的动画。与原始动画相比,有些动画速度较慢,可能是帧丢失或其他原因。有什么原因或解决方法吗? 也许会提出另一个问题? 很难调试,播放速度或变慢可能有多种原因 例如,它是一个 7mb 的 gif,所以浏览器可能很难缓冲它 是的,我希望如此,因为完成调整大小过程需要一些时间。可能是缓冲时间。你能告诉我任何解决方案吗?

以上是关于当文件大小大于 2mb 时,Imagick 无法调整 GIF 图像的大小的主要内容,如果未能解决你的问题,请参考以下文章

使用 Imagick 转换透明 PDF 文件

php imagick调整图像代码无法正常工作

当有效载荷长度大小大于 1000K 时,无法获得有效载荷响应。(Coap)

如何验证多个文件的最大文件大小为每个文件 2 mb? (验证)

Imagick PDF to JPG 未知字体

imagick - 设置输出pdf的纸张大小