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

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

内容导读

收集整理的这篇技术教程文章主要介绍了关于PHP基于yii框架实现生成ICO图标的代码解析,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含18283字,纯文字阅读大概需要27分钟

内容图文

本文给大家分享了2则php生成ICO图标的代码,第一款是基于YII框架实现的,第二款是纯php编写,都非常的不错,有需要的小伙伴可以参考下

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图像的透明色
完整方法:

/**
 * 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 class="col-md-12">
<p class="form-horizontal panel panel-default margin-t-10 b-img">

<p class="panel-heading">


<p class="pull-left"><span class="g-bg glyphicon glyphicon-wrench margin-r-2" aria-hidden="true"></span>在线制作ICO图标</p>


<p class="clearfix"></p>

</p><?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) );?>

<p class="form-group">



<label class="col-lg-2 control-label">上传文件</label>



<p class="col-md-5">




<p class="col-md-6">





<input id="upimage" type="file" name="upimage" class="hidden">





<input id="tmp_file" class="form-control" type="text">




</p>




<p class="col-md-6"><a class="btn btn-default" onclick="$('input[id=upimage]').click();">选择文件</a></p>



</p>

</p>

<p class="form-group">



<label class="col-lg-2 text-right">选择尺寸</label>



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



</p>

</p>

<p class="form-group">


<label class="col-lg-2 text-right">支持格式</label>


<p class="col-lg-5">


 png,jpg,gif


</p>

</p>

<p class="list_back">


<input type="submit" value="生 成" class="btn btn-success">

</p>
</p><?php $this->endWidget(); ?><?php if(!empty($errors) or !empty($output)):?>
<p class="form-horizontal panel panel-default margin-t-10 b-img">

<p class="panel-heading margin-b-10">


<p class="pull-left"><span class="g-bg glyphicon glyphicon-wrench margin-r-2" aria-hidden="true"></span>生成结果</p>


<p class="clearfix"></p>

</p>

<?php if(!empty($errors)):?>

<p class="form-group">


<label class="col-lg-2 text-right">生成失败</label>


<p class="col-lg-5">


<?php foreach ($errors as $e):?>


<?php echo $e;?><br>


<?php endforeach;?>


</p>

</p>

<?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);?>

<p class="form-group">


<label class="col-lg-2 text-right">成功生成</label>


<p 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">


</p>

</p>

<?php $this->endWidget(); ?>

<?php endif;?>
</p><?php endif;?></p><!-- form -->

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

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 >= 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>
<p 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><p style="/" mce_style="/""border:1px solid #D8D8B2;background-color:#FFFFDD;padding:10px/">".$output."</p></td></tr>"; 			} 			?> 		</table> 		<p 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>";
}
?> </p>		</form> 			</body> </html>

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

关于Yii框架中sphinx索引配置的分析

关于yii2中使用webuploader实现图片上传的代码

以上就是关于PHP基于yii框架实现生成ICO图标的代码解析的详细内容,更多请关注Gxl网其它相关文章!

内容总结

以上是为您收集整理的关于PHP基于yii框架实现生成ICO图标的代码解析全部内容,希望文章能够帮你解决关于PHP基于yii框架实现生成ICO图标的代码解析所遇到的程序开发问题。 如果觉得技术教程内容还不错,欢迎将网站推荐给程序员好友。

内容备注

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。


本文关键词:

联系我们

在线咨询:点击这里给我发消息

邮件:w420220301@qq.com