1,phpthumb_ico 是生成ICO圖標的類,源碼如下
html' target='_blank'>class phpthumb_ico { function phpthumb_ico() { return true;
function GD2ICOstring( $gd_image_array) { foreach ($gd_image_array as $key = $gd_image) { $ImageWidths[$key] = ImageSX($gd_image); $ImageHeights[$key] = ImageSY($gd_image); $bpp[$key] = ImageIsTrueColor($gd_image) ? 32 : 24; $totalcolors[$key] = ImageColorsTotal($gd_image); $icXOR[$key] = for ($y = $ImageHeights[$key] - 1; $y $y--) { for ($x = 0; $x $ImageWidths[$key]; $x++) { $argb = $this- GetPixelColor($gd_image, $x, $y); $a = round(255 * ((127 - $argb[ alpha ]) / 127)); $r = $argb[ red $g = $argb[ green $b = $argb[ blue if ($bpp[$key] == 32) { $icXOR[$key] .= chr($b).chr($g).chr($r).chr($a); } elseif ($bpp[$key] == 24) { $icXOR[$key] .= chr($b).chr($g).chr($r); if ($a 128) { @$icANDmask[$key][$y] .= 1 } else { @$icANDmask[$key][$y] .= 0 // mask bits are 32-bit aligned per scanline while (strlen($icANDmask[$key][$y]) % 32) { $icANDmask[$key][$y] .= 0 $icAND[$key] = foreach ($icANDmask[$key] as $y = $scanlinemaskbits) { for ($i = 0; $i strlen($scanlinemaskbits); $i += 8) { $icAND[$key] .= chr(bindec(str_pad(substr($scanlinemaskbits, $i, 8), 8, 0 , STR_PAD_LEFT))); foreach ($gd_image_array as $key = $gd_image) { $biSizeImage = $ImageWidths[$key] * $ImageHeights[$key] * ($bpp[$key] / 8); // BITMAPINFOHEADER - 40 bytes $BitmapInfoHeader[$key] = $BitmapInfoHeader[$key] .= /x28/x00/x00/x00 // DWORD biSize; $BitmapInfoHeader[$key] .= $this- LittleEndian2String($ImageWidths[$key], 4); // LONG biWidth; // The biHeight member specifies the combined // height of the XOR and AND masks. $BitmapInfoHeader[$key] .= $this- LittleEndian2String($ImageHeights[$key] * 2, 4); // LONG biHeight; $BitmapInfoHeader[$key] .= /x01/x00 // WORD biPlanes; $BitmapInfoHeader[$key] .= chr($bpp[$key]). /x00 // wBitCount; $BitmapInfoHeader[$key] .= /x00/x00/x00/x00 // DWORD biCompression; $BitmapInfoHeader[$key] .= $this- LittleEndian2String($biSizeImage, 4); // DWORD biSizeImage; $BitmapInfoHeader[$key] .= /x00/x00/x00/x00 // LONG biXPelsPerMeter; $BitmapInfoHeader[$key] .= /x00/x00/x00/x00 // LONG biYPelsPerMeter; $BitmapInfoHeader[$key] .= /x00/x00/x00/x00 // DWORD biClrUsed; $BitmapInfoHeader[$key] .= /x00/x00/x00/x00 // DWORD biClrImportant;
$icondata = /x00/x00 // idReserved; // Reserved (must be 0) $icondata .= /x01/x00 // idType; // Resource Type (1 for icons) $icondata .= $this- LittleEndian2String(count($gd_image_array), 2); // idCount; // How many images? $dwImageOffset = 6 + (count($gd_image_array) * 16); foreach ($gd_image_array as $key = $gd_image) { // ICONDIRENTRY idEntries[1]; // An entry for each image (idCount of em) $icondata .= chr($ImageWidths[$key]); // bWidth; // Width, in pixels, of the image $icondata .= chr($ImageHeights[$key]); // bHeight; // Height, in pixels, of the image $icondata .= chr($totalcolors[$key]); // bColorCount; // Number of colors in image (0 if =8bpp) $icondata .= /x00 // bReserved; // Reserved ( must be 0) $icondata .= /x01/x00 // wPlanes; // Color Planes $icondata .= chr($bpp[$key]). /x00 // wBitCount; // Bits per pixel $dwBytesInRes = 40 + strlen($icXOR[$key]) + strlen($icAND[$key]); $icondata .= $this- LittleEndian2String($dwBytesInRes, 4); // dwBytesInRes; // How many bytes in this resource? $icondata .= $this- LittleEndian2String($dwImageOffset, 4); // dwImageOffset; // Where in the file is this image? $dwImageOffset += strlen($BitmapInfoHeader[$key]); $dwImageOffset += strlen($icXOR[$key]); $dwImageOffset += strlen($icAND[$key]); foreach ($gd_image_array as $key = $gd_image) { $icondata .= $BitmapInfoHeader[$key]; $icondata .= $icXOR[$key]; $icondata .= $icAND[$key]; return $icondata; function LittleEndian2String($number, $minbytes=1) { $intstring = while ($number 0) { $intstring = $intstring.chr($number 255); $number = 8; return str_pad($intstring, $minbytes, /x00 , STR_PAD_RIGHT); function GetPixelColor( $img, $x, $y) { if (!is_resource($img)) { return false; return @ImageColorsForIndex($img, @ImageColorAt($img, $x, $y));}
2,后臺
引入類:
Yii::$enableIncludePath = false;Yii::import ( application.extensions.ico.phpthumb_ico , 1 );
解決生成黑色背景的問題
imagealphablending($resize_im, false);//不合并顏色,直接用$im圖像顏色替換,包括透明色
imagesavealpha($resize_im, true);//不要丟了$resize_im圖像的透明色
完整方法:
/** * icoMaker 在線生成ICO圖標 * @author flashalliance public function actionIco() { $this- breadcrumbs=array_merge($this- breadcrumbs,array( ICO圖標制作 $output = $errors=array(); if(isset($_GET[ action ]) $_GET[ action ] == make ){ if(isset($_FILES[ upimage ][ tmp_name ]) $_FILES[ upimage ][ tmp_name ] is_uploaded_file($_FILES[ upimage ][ tmp_name ])){ if($_FILES[ upimage ][ size ] 204800){ $errors[]= 你上傳的文件過大,最大不能超過200K。 $fileext = array( image/pjpeg , image/jpeg , image/gif , image/x-png , image/png if(!in_array($_FILES[ upimage ][ type ],$fileext)){ $errors[]= 你上傳的文件格式不正確,僅支持 png, jpg, gif格式。 if($im = @imagecreatefrompng($_FILES[ upimage ][ tmp_name ]) or $im = @imagecreatefromgif($_FILES[ upimage ][ tmp_name ]) or $im = @imagecreatefromjpeg($_FILES[ upimage ][ tmp_name ])){ $imginfo = @getimagesize($_FILES[ upimage ][ tmp_name if(!is_array($imginfo)){ $errors[]= 圖像格式錯誤! if(empty($errors)){ switch($_POST[ size ]){ case 1; $resize_im = @imagecreatetruecolor(16,16); $size = 16; break; case 2; $resize_im = @imagecreatetruecolor(32,32); $size = 32; break; case 3; $resize_im = @imagecreatetruecolor(48,48); $size = 48; break; default; $resize_im = @imagecreatetruecolor(32,32); $size = 32; break; imagesavealpha($im, true); imagealphablending($resize_im, false);//不合并顏色,直接用$im圖像顏色替換,包括透明色 imagesavealpha($resize_im, true);//不要丟了$resize_im圖像的透明色,解決生成黑色背景的問題 imagecopyresampled($resize_im,$im,0,0,0,0,$size,$size,$imginfo[0],$imginfo[1]); Yii::$enableIncludePath = false; Yii::import ( application.extensions.ico.phpthumb_ico , 1 ); $icon = new phpthumb_ico(); $gd_image_array = array($resize_im); $icon_data = $icon- GD2ICOstring($gd_image_array); $bas_path=dirname ( Yii::app ()- BasePath ); $bas_new_path=$bas_path. /upload/ico/ if(!is_dir($bas_new_path)){ mkdir($bas_new_path, 0777, true); $filePath=$bas_new_path. date( Ymdhis ).uniqid(). rand(1,1000) . .ico if(file_put_contents($filePath, $icon_data)){ $output = str_replace($bas_path, ,$filePath); }else{ $errors[]= 生成錯誤請重試! $this- render ( ico ,array( output = $output, errors = $errors)); }
3,前臺
p >再給大家分享一個獨立的類
phpthumb.ico.php
?php ////////////////////////////////////////////////////////////// /// phpThumb() by James Heinrich [email protected] // // available at http://phpthumb.sourceforge.net /// ////////////////////////////////////////////////////////////// /// // // phpthumb.ico.php - .ICO output format functions // // /// ////////////////////////////////////////////////////////////// class phpthumb_ico { function phpthumb_ico() { return true; function GD2ICOstring( $gd_image_array) { foreach ($gd_image_array as $key = $gd_image) { $ImageWidths[$key] = ImageSX($gd_image); $ImageHeights[$key] = ImageSY($gd_image); $bpp[$key] = ImageIsTrueColor($gd_image) ? 32 : 24; $totalcolors[$key] = ImageColorsTotal($gd_image); $icXOR[$key] = for ($y = $ImageHeights[$key] - 1; $y $y--) { for ($x = 0; $x $ImageWidths[$key]; $x++) { $argb = $this- GetPixelColor($gd_image, $x, $y); $a = round(255 * ((127 - $argb[ alpha ]) / 127)); $r = $argb[ red $g = $argb[ green $b = $argb[ blue if ($bpp[$key] == 32) { $icXOR[$key] .= chr($b).chr($g).chr($r).chr($a); } elseif ($bpp[$key] == 24) { $icXOR[$key] .= chr($b).chr($g).chr($r); if ($a 128) { @$icANDmask[$key][$y] .= 1 } else { @$icANDmask[$key][$y] .= 0 // mask bits are 32-bit aligned per scanline while (strlen($icANDmask[$key][$y]) % 32) { $icANDmask[$key][$y] .= 0 $icAND[$key] = foreach ($icANDmask[$key] as $y = $scanlinemaskbits) { for ($i = 0; $i strlen($scanlinemaskbits); $i += 8) { $icAND[$key] .= chr(bindec(str_pad(substr($scanlinemaskbits, $i, 8), 8, 0 , STR_PAD_LEFT))); foreach ($gd_image_array as $key = $gd_image) { $biSizeImage = $ImageWidths[$key] * $ImageHeights[$key] * ($bpp[$key] / 8); // BITMAPINFOHEADER - 40 bytes $BitmapInfoHeader[$key] = $BitmapInfoHeader[$key] .= /x28/x00/x00/x00 // DWORD biSize; $BitmapInfoHeader[$key] .= $this- LittleEndian2String($ImageWidths[$key], 4); // LONG biWidth; // The biHeight member specifies the combined // height of the XOR and AND masks. $BitmapInfoHeader[$key] .= $this- LittleEndian2String($ImageHeights[$key] * 2, 4); // LONG biHeight; $BitmapInfoHeader[$key] .= /x01/x00 // WORD biPlanes; $BitmapInfoHeader[$key] .= chr($bpp[$key]). /x00 // wBitCount; $BitmapInfoHeader[$key] .= /x00/x00/x00/x00 // DWORD biCompression; $BitmapInfoHeader[$key] .= $this- LittleEndian2String($biSizeImage, 4); // DWORD biSizeImage; $BitmapInfoHeader[$key] .= /x00/x00/x00/x00 // LONG biXPelsPerMeter; $BitmapInfoHeader[$key] .= /x00/x00/x00/x00 // LONG biYPelsPerMeter; $BitmapInfoHeader[$key] .= /x00/x00/x00/x00 // DWORD biClrUsed; $BitmapInfoHeader[$key] .= /x00/x00/x00/x00 // DWORD biClrImportant; $icondata = /x00/x00 // idReserved; // Reserved (must be 0) $icondata .= /x01/x00 // idType; // Resource Type (1 for icons) $icondata .= $this- LittleEndian2String(count($gd_image_array), 2); // idCount; // How many images? $dwImageOffset = 6 + (count($gd_image_array) * 16); foreach ($gd_image_array as $key = $gd_image) { // ICONDIRENTRY idEntries[1]; // An entry for each image (idCount of em) $icondata .= chr($ImageWidths[$key]); // bWidth; // Width, in pixels, of the image $icondata .= chr($ImageHeights[$key]); // bHeight; // Height, in pixels, of the image $icondata .= chr($totalcolors[$key]); // bColorCount; // Number of colors in image (0 if =8bpp) $icondata .= /x00 // bReserved; // Reserved ( must be 0) $icondata .= /x01/x00 // wPlanes; // Color Planes $icondata .= chr($bpp[$key]). /x00 // wBitCount; // Bits per pixel $dwBytesInRes = 40 + strlen($icXOR[$key]) + strlen($icAND[$key]); $icondata .= $this- LittleEndian2String($dwBytesInRes, 4); // dwBytesInRes; // How many bytes in this resource? $icondata .= $this- LittleEndian2String($dwImageOffset, 4); // dwImageOffset; // Where in the file is this image? $dwImageOffset += strlen($BitmapInfoHeader[$key]); $dwImageOffset += strlen($icXOR[$key]); $dwImageOffset += strlen($icAND[$key]); foreach ($gd_image_array as $key = $gd_image) { $icondata .= $BitmapInfoHeader[$key]; $icondata .= $icXOR[$key]; $icondata .= $icAND[$key]; return $icondata; function LittleEndian2String($number, $minbytes=1) { $intstring = while ($number 0) { $intstring = $intstring.chr($number 255); $number = 8; return str_pad($intstring, $minbytes, /x00 , STR_PAD_RIGHT); function GetPixelColor( $img, $x, $y) { if (!is_resource($img)) { return false; return @ImageColorsForIndex($img, @ImageColorAt($img, $x, $y)); ?index.php
!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd html xmlns= http://www.w3.org/1999/xhtml head title ico圖標 /title meta http-equiv= Content-Type content= text/html; charset=utf-8 / /head body p >以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP !
相關推薦:
關于Yii框架中sphinx索引配置的分析
關于yii2中使用webuploader實現圖片上傳的代碼
以上就是關于PHP基于yii框架實現生成ICO圖標的代碼解析的詳細內容,PHP教程
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答