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] .= \"\\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 <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>
<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>
本文地址:https://www.stayed.cn/item/17560
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我