应用场景,图片本地上传到服务器项目临时文件夹下,然后转存至分布式文件系统,处理过程中,遇到对图片的格式转换处理:
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源文件重新编译。