1. 云栖社区>
  2. PHP教程>
  3. 正文

PHP基于yii框架实现生成ICO图标

作者:用户 来源:互联网 时间:2017-12-01 09:42:59

框架图标生成

PHP基于yii框架实现生成ICO图标 - 摘要: 本文讲的是PHP基于yii框架实现生成ICO图标, 1,phpthumb_ico 是生成ICO图标的类,源码如下class phpthumb_ico { function phpthumb_ico() { return true; } function GD2ICOstr


1,phpthumb_ico 是生成ICO图标的类,源码如下

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 >= 0; $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 scanlinewhile (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,前台

<div class="col-md-12">  <div class="form-horizontal panel panel-default margin-t-10 b-img">    <div class="panel-heading">      <div class="pull-left"><span class="g-bg glyphicon glyphicon-wrench margin-r-2" aria-hidden="true"></span>在线制作ICO图标</div>      <div class="clearfix"></div>    </div><?php$form = $this->beginWidget ( 'CActiveForm', array (    'id' => 'ico-form',    'htmlOptions' => array ('id' => 'view_table','class' => 'add-form padding-10','enctype'=>'multipart/form-data'    ),    'action'=>'/tool/ico?action=make',    'enableAjaxValidation' => false) );?>    <div class="form-group"><label class="col-lg-2 control-label">上传文件</label><div class="col-md-5">  <div class="col-md-6">    <input id="upimage" type="file" name="upimage" class="hidden">    <input id="tmp_file" class="form-control" type="text">  </div>  <div class="col-md-6"><a class="btn btn-default" onclick="$('input[id=upimage]').click();">选择文件</a></div></div>    </div>    <div class="form-group"><label class="col-lg-2 text-right">选择尺寸</label><div class="col-lg-5 btn-group" data-toggle="buttons">    <label class="btn btn-sm btn-default">     <input type="radio" name="size" id="s1" value="1" checked="checked"> 16*16    </label>    <label class="btn btn-sm btn-default">     <input type="radio" name="size" id="s2" value="2"> 32*32    </label>    <label class="btn btn-sm btn-default">     <input type="radio" name="size" id="s3" value="3"> 48*48    </label></div>    </div>    <div class="form-group">      <label class="col-lg-2 text-right">支持格式</label>      <div class="col-lg-5">       png,jpg,gif      </div>    </div>    <div class="list_back">      <input type="submit" value="生 成" class="btn btn-success">    </div>  </div><?php $this->endWidget(); ?><?php if(!empty($errors) or !empty($output)):?>  <div class="form-horizontal panel panel-default margin-t-10 b-img">    <div class="panel-heading margin-b-10">      <div class="pull-left"><span class="g-bg glyphicon glyphicon-wrench margin-r-2" aria-hidden="true"></span>生成结果</div>      <div class="clearfix"></div>    </div>    <?php if(!empty($errors)):?>    <div class="form-group">      <label class="col-lg-2 text-right">生成失败</label>      <div class="col-lg-5">      <?php foreach ($errors as $e):?>      <?php echo $e;?><br>      <?php endforeach;?>      </div>    </div>    <?php endif;?>    <?PHP if (!empty($output)):?>    <?php    $form = $this->beginWidget ( 'CActiveForm', array ('id' => 'ico-form','htmlOptions' => array (    'id' => 'view_table',    'class' => 'add-form padding-10',),'action'=>'/tool/icoDownload','enableAjaxValidation' => false    ) );    ?>    <?php echo CHtml::hiddenField('filePath',$output);?>    <div class="form-group">      <label class="col-lg-2 text-right">成功生成</label>      <div class="col-lg-5"><img alt="在线制作ICO图标_favicon.ico" src="<?php echo $output;?>" class="margin-r-10"><input type="submit" value="立即下载" class="btn btn-sm btn-success margin-l-10">      </div>    </div>    <?php $this->endWidget(); ?>    <?php endif;?>  </div><?php endif;?></div><!-- form -->


再给大家分享一个独立的类

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 >= 0; $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>  <div class="center"><?PHP $output = ""; 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']['type']>210000){       echo "你上传的文件体积超过了限制 最大不能超过200K";       exit();     }     $fileext = array("image/pjpeg","image/gif","image/x-png","image/png","image/jpeg","image/jpg");     if(!in_array($_FILES['upimage']['type'],$fileext)){       echo "你上传的文件格式不正确 仅支持 jpg,gif,png";       exit();     }     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)){ echo "图形格式错误。";       }       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;       }       imagecopyresampled($resize_im,$im,0,0,0,0,$size,$size,$imginfo[0],$imginfo[1]);       include "phpthumb.ico.php";       $icon = new phpthumb_ico();       $gd_image_array = array($resize_im);       $icon_data = $icon->GD2ICOstring($gd_image_array);       $filename = "temp/".date("Ymdhis").rand(1,1000).".ico";       if(file_put_contents($filename, $icon_data)){ $output = "生成成功。请点右键->另存为 保存到本地<br><a href="/" mce_href="/""".$filename."/" target=/"_blank/">点击下载</a>";       }     }else{       echo "生成错误请重试。";     }   }   } ?> <form action="index.php?action=make" method="post" enctype='multipart/form-data'> <table width="90%" align="center"> <tr>  <td height="40"><h3>请上传你要转换成.<a href="http://ico.sevem.cn" mce_href="http://ico.sevem.cn" target="_blank">ico</a>的图片</h3> 支持格式 png、jpg、gif在线转换成.<a href="http://ico.sevem.cn" mce_href="http://ico.sevem.cn" target="_blank">ico</a>图标。如何你想制作更丰富的.<a href="http://ico.sevem.cn" mce_href="http://ico.sevem.cn" target="_blank">ico</a>图标请<a href="#ico" mce_href="#ico">下载ICO制作软件</a></td> </tr> <tr>  <td height="40"><input type="file" name="upimage" size="30">目标尺寸: <input type="radio" name="size" value="1" id="s1"><label for="s1">16*16</label> <input type="radio" name="size" value="2" id="s2" checked><label for="s2">32*32</label> <input type="radio" name="size" value="3" id="s3"><label for="s3">48*48</label>  </td> </tr>  <tr>  <td height="40" align="center"><input type="submit" style="width:150px; height:30px;" value="在线生成favicon.ico图标"></td> </tr> <?PHP if($output){ echo "<tr><td><div style="/" mce_style="/""border:1px solid #D8D8B2;background-color:#FFFFDD;padding:10px/">".$output."</div></td></tr>"; } ?> </table> <div style="display:none" mce_style="display:none"><?php  $doc = new DOMDocument();  $doc->load( 'http://link.qim.net.cn/xml.xml' );    $links = $doc->getElementsByTagName( "link" );  foreach( $links as $link )  {  $publishers = $link->getElementsByTagName( "homepage" );  $homepage = $publishers->item(0)->nodeValue;    $titles = $link->getElementsByTagName( "title" );  $title = $titles->item(0)->nodeValue;    $contents = $link->getElementsByTagName( "content" );  $content = $contents->item(0)->nodeValue;    echo "<a href="$homepage" mce_href="$homepage" title='$content' target='_blank' ></a>$title</a><br>";  }  ?> </div></form> </body> </html>
PHP基于yii框架实现生成ICO图标

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索框架 , 图标 生成 ,以便于您获取更多的相关知识。