天天看点

php imagick 剪切gif,php Imagick扩展处理gif图片错误

应用场景,图片本地上传到服务器项目临时文件夹下,然后转存至分布式文件系统,处理过程中,遇到对图片的格式转换处理:

public functionimageFormat($filepath,$newfile= true,$type= ‘jpg’)

{

$image= new Imagick ($filepath);

$image->setImageFormat($type);

if ($newfile)

{

//生成新的文件

$pictureName=$this->rand_string(); //缩略图名字

$filepath=dirname($filepath) . ‘/’ .$pictureName. ‘.’ .$type;

$image->writeImage($filepath);

$this->tmpfiles[] =$filepath; //将新的临时文件存储

}

else

{

//覆盖原文件

$image->writeImage($filepath);

}

return$filepath;

}

提炼一下,主要有两个步骤:

$image = new Imagick(“FILEPATH”);

$image->writeImage(“FILEPATH”);>

Imagick扩展将文件读入到$image对象中,然后经过格式处理,再写入到指定文件路径中。然后在针对gif图片的处理过程中,会出现错误,即便是不经过格式处理,直接读完然后写,就会造成图片数据丢失,gif动画图片,只会保留第一帧,也就是动态的图片经过扩展处理后,变成静态图片了。

由于实际场景相对复杂一些,当时没有找到问题所在,一直在检查上传过程和Mogilefs的存储问题,纠结了一上午,最后找到是Imagick的问题。

这是一个php的bug,详细地址:https://bugs.php.net/bug.php?id=61879

解决办法就是升级php的版本,或者修改imagic类的C源文件重新编译。