PHP的Favicon產生ICO圖標,在網上找到的PHP源碼文件,大部份代碼如出一轍,很多都帶有相同一個BUG,用PNG或WEBP圖片產生出來的 .ico 網頁圖示,都不是透明底,是黑色背景。
經過查閱大量的資料,多次嘗試(因為技術太烏,只能一遍遍的調試)最終解決了這個問題,將解決方法過程記錄如下:請看圖片▼
ICO 透明製作!
原來的 2 行代碼:
$tmp = imagecreatetruecolor($newwidth,$newheight); //創建新畫布
imagecopyresampled($tmp,$image,0,0,0,0,$newwidth,$newheight,$width,$height); //處理圖片到新尺寸
需要將以上兩行代碼修改。
找:
$tmp = imagecreatetruecolor($newwidth,$newheight);
修改為:
/* --- 用以處理縮放gif和png圖透明背景變黑色問題 開始 --- */
$tmp = imagecreatetruecolor($newwidth,$newheight);
$color = imagecolorallocatealpha($tmp,0, 0, 0, 127);
imagecolortransparent($tmp,$color);
imagefill($tmp,0,0,$color);
/* --- 用以處理縮放gif和png圖透明背景變黑色問題 結束 --- */
找:
imagecopyresampled($tmp,$image,0,0,0,0,$newwidth,$newheight,$width,$height);
修改為:
imagecopyresampled($tmp,$image,0,0,0,0,$newwidth,$newheight,$width,$height);
imagesavealpha($tmp, true); //注意這裡還有一句!
高潮來了!!在網上找到的都是這些教程!!,我按照位置放上去了,竟然沒用!!黑色背景是消失了,但是生成的又是白色背景的圖標,仍然不是透明的!!
後來才發現下面還有一個函數:
imagejpeg($tmp,$directory.$filename,100)
這個是生成 .jpeg 的怎麽可能會透明!!
所以改成了:
imagepng($tmp,$directory.$filename,100)
TNND竟然直接報錯!!
imagepng(): gd-png: fatal libpng error: Incompatible libpng version in application and library
原因:JPEG圖像產生的圖像的質量的是一個範圍從0(最低質量,最小的文件大小)到100(最高質量,最大文件大小)。而出現這一錯誤的原因是 ImagePNG 生成圖像的質量範圍從 0 至 9 的,傳入的這個範圍以外的參數則該函數不會工作。
所以簡單地將值更改為 0 到 9 之間,錯誤會自行消失。
最終將此函數改為如下即可正常產生背景透明 ICO圖標了。
imagepng($tmp,$directory.$filename,9)
花了我整整一個上午的時間。需要的請拿走!
共修改 3 個地方,最終效果如下:
if($image){
list($width,$height) = getimagesize($postvars["image_tmp"]);
$newwidth = $postvars["image_dimensions"];
$newheight = $postvars["image_dimensions"];
$tmp = imagecreatetruecolor($newwidth,$newheight);
/* --- 用以處理縮放gif和png圖透明背景變黑色問題 開始 --- */
$color = imagecolorallocatealpha($tmp,0, 0, 0, 127);
imagecolortransparent($tmp,$color);
imagefill($tmp,0,0,$color);
/* --- 用以處理縮放gif和png圖透明背景變黑色問題 結束 --- */
// Copy the image to one with the new width and height.
imagecopyresampled($tmp,$image,0,0,0,0,$newwidth,$newheight,$width,$height);
imagesavealpha($tmp, true); //注意這裡還有一句!
// Create image file with 100% quality.
if(is_dir($directory)){
if(is_writable($directory)){
imagepng($tmp,$directory.$filename,9) or die('Could not make image file');
if(file_exists($directory.$filename)){
// Image created, now rename it to its
$ext_pos = strpos($rand.$postvars["image"],"." . $ext);
$strip_ext = substr($rand.$postvars["image"],0,$ext_pos);
// Rename image to .ico file
rename($directory.$filename,$directory.$strip_ext.".ico");
請看圖片:
線上Favicon產生器:ifreesite.com/favicon