應用場景,圖檔本地上傳到伺服器項目臨時檔案夾下,然後轉存至分布式檔案系統,處理過程中,遇到對圖檔的格式轉換處理:
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源檔案重新編譯。