栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > PHP

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

PHP 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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 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] .= "x28x00x00x00"; // 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] .= "x01x00";     // WORD  biPlanes;
 $BitmapInfoHeader[$key] .= chr($bpp[$key])."x00";      // wBitCount;
      $BitmapInfoHeader[$key] .= "x00x00x00x00"; // DWORD biCompression;
      $BitmapInfoHeader[$key] .= $this->LittleEndian2String($biSizeImage, 4);      // DWORD biSizeImage;
      $BitmapInfoHeader[$key] .= "x00x00x00x00"; // LONG  biXPelsPerMeter;
      $BitmapInfoHeader[$key] .= "x00x00x00x00"; // LONG  biYPelsPerMeter;
      $BitmapInfoHeader[$key] .= "x00x00x00x00"; // DWORD biClrUsed;
      $BitmapInfoHeader[$key] .= "x00x00x00x00"; // DWORD biClrimportant;
    }
 
 
    $icondata = "x00x00";     // idReserved;  // Reserved (must be 0)
    $icondata .= "x01x00";     // 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 .= "x01x00";   // 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图像的透明色
完整方法:


  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,前台


  
    
      在线制作ICO图标
      
    
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
) );
?>
    
 
 
   
     
     
   
   选择文件
 
    
    
 
 
     
     
     
 
    
    
      
      
png,jpg,gif
      
    
    
      
    
  
endWidget(); ?>

  
    
      生成结果
      
    
    
    
      
      
      
      
beginWidget ( 'CActiveForm', array ( 'id' => 'ico-form', 'htmlOptions' => array ( 'id' => 'view_table', 'class' => 'add-form padding-10', ), 'action'=>'/tool/icoDownload', 'enableAjaxValidation' => false ) ); ?> " class="margin-r-10"> endWidget(); ?>

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

phpthumb.ico.php

  // 
//    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



 
ico图标

 
 
 
		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 = "生成成功!请点右键->另存为 保存到本地
点击下载"; } }else{ echo "生成错误请重试!"; } } } ?>

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/44517.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号