今天客戶反映,上傳的圖片生成縮略圖有的圖片變成黑色,
出現問題就百度了一下,有不少網友也遇到這樣的問題,但是官方論壇也沒有給出解決辦法,那還得靠自己解決了,於是就研究phpcms v9 圖片壓縮代碼。
打開\phpcms\libs\classes\image.class.php,看了半天也沒有看出哪里的錯誤。
網上有很多關於php png圖片壓縮變成黑色的問題,我剛開始也以為是這樣問題,但是v9的源碼里做了這樣問題的處理,所以排除這個原因。
突然想到了錯誤日志,打開\caches\error_log.php 錯誤日志,發現問題了。
09-05 12:03:43 | 2 | imagecreatefrompng(): '/alidata/www/uploadfile/2016/0719/thumb_506_351_20160704061846270.png' is not a valid PNG file | phpcms/libs/classes/image.class.php | 102
一眼看到這樣錯誤,我就知道什么錯誤,原因是這張圖片后綴是png圖片,但實質不是png圖片,應該是其他類型圖片人為修改為png圖片,為了驗證這一點,我寫了一段代碼驗證一下,代碼如下:
$url="http://www.xxxx.com/uploadfile/2016/0719/thumb_506_351_20160704061846270.png"; print_r(getimagesize($url)); print_r("<br/>"); print_r(pathinfo($url));
輸出結果如下:
Array ( [0] => 506 [1] => 351 [2] => 2 [3] => width="506" height="351" [bits] => 8 [channels] => 3 [mime] => image/jpeg ) Array ( [dirname] => http://www.xxxx.com/uploadfile/2016/0719 [basename] => thumb_506_351_20160704061846270.png [extension] => png [filename] => thumb_506_351_20160704061846270 )
大家看到了 mime 和 extension了沒有??
再來看一下v9的源碼
v9里使用pathinfo來獲取圖片的后綴,這樣導致很多圖片是人為修改的后綴圖片,在使用imagecreatefrom 函數 (imagecreatefromgif,imagecreatefromjpeg,imagecreatefrompng)創建畫布的時候選錯函數。
解決方法:
注銷掉80行:$type = $pathinfo['extension']; 就ok了。
$info['type'] 上面函數已經獲取到了圖片mime擴展類型。