注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天朝布衣田中码农参上

苦逼码农的点点滴滴,请多多指教!

 
 
 

日志

 
 
 
 

php在线生成favicon.ico文件的类代码  

2017-09-14 16:56:41|  分类: PHP |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
ico是Icon file的缩写,是图片文件格式的一种,可以存储单个图案、多尺寸、多色板的图标文件。图标有一套标准的大小和属性格式,且通常是小尺寸的。而所谓favicon.ico,即Favorites Icon的缩写,顾名思义,便是其可以让浏览器的收藏夹中除显示相应的标题外,还以图标的方式区别不同的网站。当然,这不是Favicon的全部,根据浏览器的不同,Favicon显示也会有所区别:在大多数主流浏览器如FireFox和Internet Explorer (5.5及以上版本)中,favicon不仅在收藏夹中显示,还会同时出现在地址栏上,这时用户可以拖曳favicon到桌面以建立到网站的快捷方式;除此之外,标签式浏览器甚至还有不少扩展的功能,如FireFox甚至支持动画格式的favicon等。常用的Favicon.ico图标有3种规格16×16、32×32、48×48,这一点还请注意。当然如果您对统一的网站默认图标不满意,还可以分别为单独的页面去设置页面图标,代码如下:

<head>

...

<link rel="icon" href="/dir/593668.com.ico" mce_href="/dir/593668.com.ico" type="image/x-icon">
<link rel="shortcut icon" href="/dir/593668.com.ico" mce_href="/dir/593668.com.ico" type="image/x-icon">

...

</head>

要想利用php来生成ico文件,当然首先得引入一个类phpthumb_ico,相关代码如下:

<?php

class phpthumb_ico {
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';
}
}
// 遮罩是32位,每行对齐
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);
//位图头部占40bytes,需要了解更多请自行去查看相关文档
$BitmapInfoHeader[$key] = '';
$BitmapInfoHeader[$key] .= "\x28\x00\x00\x00";
$BitmapInfoHeader[$key] .= $this->LittleEndian2String($ImageWidths[$key], 4);
$BitmapInfoHeader[$key] .= $this->LittleEndian2String($ImageHeights[$key] * 2, 4);
$BitmapInfoHeader[$key] .= "\x01\x00";
$BitmapInfoHeader[$key] .= chr($bpp[$key])."\x00";
$BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";
$BitmapInfoHeader[$key] .= $this->LittleEndian2String($biSizeImage, 4);
$BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";
$BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";
$BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";
$BitmapInfoHeader[$key] .= "\x00\x00\x00\x00";
}
$icondata = "\x00\x00";//保留,必须置成0
$icondata .= "\x01\x00";//类型,1代表icon
$icondata .= $this->LittleEndian2String(count($gd_image_array), 2);
$dwImageOffset = 6 + (count($gd_image_array) * 16);
foreach ($gd_image_array as $key => $gd_image) {
$icondata .= chr($ImageWidths[$key]); //宽
$icondata .= chr($ImageHeights[$key]); //高
$icondata .= chr($totalcolors[$key]);
$icondata .= "\x00";//保留
$icondata .= "\x01\x00"; //调色版
$icondata .= chr($bpp[$key])."\x00";
$dwBytesInRes = 40 + strlen($icXOR[$key]) + strlen($icAND[$key]);
$icondata .= $this->LittleEndian2String($dwBytesInRes, 4);
$icondata .= $this->LittleEndian2String($dwImageOffset, 4);
$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) {
while ($number > 0) {
$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));
}
}

?>

然后再是一个外部调用的函数。

<?php

//依据图片创建ico,第一个参数是文件路径,第二个参数是生成ICON文件的路径,第三个参数是指定ICON文件的大小
function createicon($pic_path,$icon_pic_path='',$size=32){
$sizearr = array(16, 32, 48);//ico图标格式三种,16,32,48
if(!in_array($size, $sizearr)){
$size=32; //如果非法输入,按默认处理
}
$pathInfos = pathinfo($pic_path);
$img_infos = getimagesize($pic_path);
switch( strtolower($pathInfos['extension']) ) {
case 'jpg':
case 'jpeg':
$imagecreatefrom = 'imagecreatefromjpeg';
break;
case 'png':
$imagecreatefrom = 'imagecreatefrompng';
break;
case 'gif':
$imagecreatefrom = 'imagecreatefromgif';
break;
default:
$imagecreatefrom = 'imagecreatefromstring';
$pic_path = file_get_contents($pic_path);
break;
}
$resource = $imagecreatefrom($pic_path);
$thum_handle = imagecreatetruecolor($size,$size);
imagealphablending($thum_handle,false);//不合并颜色,直接用$img图像颜色替换,包括透明色;
imagesavealpha($thum_handle,true);//保持图像的透明色;
if(function_exists('imagecopyresampled')){
imagecopyresampled($thum_handle,$resource, 0, 0, 0, 0,$size,$size,$img_infos[0],$img_infos[1]);
}else{
imagecopyresized($thum_handle,$resource, 0, 0, 0, 0,$size,$size,$img_infos[0],$img_infos[1]);
}
$icon = new phpthumb_ico();
$gd_image_array = array($thum_handle);
$icon_data = $icon->GD2ICOstring($gd_image_array);
if($icon_pic_path=='')$icon_pic_path=str_replace($pathInfos['extension'],"ico",$pic_path);
if(file_put_contents($icon_pic_path, $icon_data)){
echo "生成成功!请点右键->另存为 保存到本地<br><a href=\"".$icon_pic_path."\" target=\"_blank\">点击下载</a>";
}
imagedestroy($thum_handle);//清除句柄
imagedestroy($resource);//清除句柄
}

?>

那么最终想要生成ICON文件,只需要调用如下代码即可。

<?php

//生成跟原始文件同名的icon文件
//createicon('593668.com.jpg');
//指定生成的icon文件路径
//createicon('593668.com.jpg','icon/593668.com.ico');
//指定生成icon文件路径,且限制其尺寸为32X32
createicon('593668.com.jpg','icon/593668.com.ico',48);

?>

页面执行效果如下:
php在线生成favicon.ico文件的类代码 - 1976xyg - 红尘若梦
 
有了以上代码,那么您也可以自行制作一个在线生成icon文件的网站了,怎么样,要不要去试试。对了,利用这个,还可以为每个页面都生成一个特定的icon文件,这样看起来也许会更酷。




  评论这张
 
阅读(0)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017