首页 > 编程 > PHP > 正文

关于PHP基于yii框架实现生成ICO图标的代码解析

2020-03-22 20:12:56
字体:
来源:转载
供稿:网友
本文给大家分享了2则php生成ICO图标的代码,第一款是基于YII框架实现的,第二款是纯php编写,都非常的不错,有需要的小伙伴可以参考下

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 info@silisoftware.com // // 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教程

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表