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

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

/**

* 修改图片的格式

* @var string filepath

* @var bool $newfile 是否生成新文件,如果不是则覆盖原文件

* @var string $type 生成的图片类型

* @see 该函数对gif图片的处理会造成数据丢失,图片损坏。

* 参考php bug清单:https://bugs.php.net/bug.php?id=61879

*/

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源文件重新编译。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值