php在线生成ico文件的代码


Posted in PHP onOctober 09, 2007

index.php

<?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"); 
        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=\"".$filename."\" target=\"_blank\">点击下载</a>"; 
            }         }else{ 
            echo "生成错误请重试!"; 
        } 
    }     
} 
?> 
<html> 
<head> 
<title>ICO图标在线转换</title> 
<style> 
body{background-color:#fff;color:#000000;font-family:arial;margin:30px;font-size:12px;} 
table{border:0} 
td{line-height:16px;} 
label{cursor:hand;} 
</style> 
</head> 
<body> 
<h1>ICO图标在线转换</h1> 
<form action="?action=make" method="post" enctype='multipart/form-data'> 
<table> 
    <tr> 
        <td><b>请上传你要转换的图片</b><br>支持格式 png,jpg,gif</td> 
    </tr> 
    <tr> 
        <td><input type="file" name="upimage" size="30"></td> 
    </tr> 
    <tr> 
        <td>目标尺寸: 
        <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 align="right"><input type="submit" value="生 成"></td> 
    </tr> 
    <?PHP 
    if($output){ 
        echo "<tr><td><div style=\"border:1px solid #D8D8B2;background-color:#FFFFDD;padding:10px\">".$output."</div></td></tr>"; 
    } 
    ?> 
    <tr> 
        <td><div style="color:#cccccc;font-size:11px;">Powered by <a href="http://veryim.com" style="color:#cccccc">非常爱漫</a> </div></td> 
    </tr> 
</table> 
</form> 
</body> 
</html>

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));
    }
}
?>
PHP 相关文章推荐
简单的用PHP编写的导航条程序
Oct 09 PHP
缓存技术详谈―php
Dec 14 PHP
php 数据库字段复用的基本原理与示例
Jul 22 PHP
PHP连接局域网MYSQL数据库的简单实例
Aug 26 PHP
ThinkPHP3.1新特性之Action参数绑定
Jun 19 PHP
PHP防止图片盗用(盗链)的方法小结
Nov 11 PHP
ZendFramework框架实现连接两个或多个数据库的方法
Dec 08 PHP
PHP 中TP5 Request 请求对象的实例详解
Jul 31 PHP
PhpStorm配置Xdebug调试的方法步骤
Feb 02 PHP
php根据命令行参数生成配置文件详解
Mar 15 PHP
PHP7匿名类的用法示例
Apr 05 PHP
PHP字符串中抽取子串操作实例分析
Jun 22 PHP
pw的一个放后门的方法分析
Oct 08 #PHP
使用 eAccelerator加速PHP代码的方法
Sep 30 #PHP
实现php加速的eAccelerator dll支持文件打包下载
Sep 30 #PHP
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
Sep 30 #PHP
一些常用的php简单命令代码集锦
Sep 24 #PHP
php下实现伪 url 的超简单方法[转]
Sep 24 #PHP
首页四格,首页五格For6.0(GBK)(UTF-8)[12种组合][9-18][版主安装测试通过]
Sep 24 #PHP
You might like
Bo-Blog专用的给Windows服务器的IIS Rewrite程序
2007/08/26 PHP
php重定向的三种方法分享
2012/02/22 PHP
关于PHP转换超过2038年日期出错的问题解决
2017/06/28 PHP
jQuery入门第一课 jQuery选择符
2010/03/14 Javascript
javascript 在firebug调试时用console.log的方法
2012/05/10 Javascript
js判断生效时间不得大于失效时间的思路及代码
2013/04/23 Javascript
利用JQuery和Servlet实现跨域提交请求示例分享
2014/02/12 Javascript
jquery实现页面图片等比例放大缩小功能
2014/02/12 Javascript
javascript 中__proto__和prototype详解
2014/11/25 Javascript
浅谈jQuery页面的滚动位置scrollTop、scrollLeft
2015/05/19 Javascript
JavaScript判断变量是否为数组的方法(Array)
2016/02/24 Javascript
JS函数修改html的元素内容,及修改属性内容的方法
2016/10/28 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
bootstrap switch开关组件使用方法详解
2017/08/22 Javascript
基于nodejs实现微信支付功能
2017/12/20 NodeJs
JS实现二维数组横纵列转置的方法
2018/04/17 Javascript
vue2 v-model/v-text 中使用过滤器的方法示例
2019/05/09 Javascript
解决layui 表单元素radio不显示渲染的问题
2019/09/04 Javascript
js实现车辆管理系统
2020/08/26 Javascript
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python实现的简单猜数字游戏
2015/04/04 Python
python中字典(Dictionary)用法实例详解
2015/05/30 Python
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
python里使用正则表达式的组嵌套实例详解
2017/10/24 Python
用Python+OpenCV对比图像质量的几种方法
2019/07/15 Python
python中类的输出或类的实例输出为这种形式的原因
2019/08/12 Python
通过实例了解python__slots__使用方法
2020/09/14 Python
python 还原梯度下降算法实现一维线性回归
2020/10/22 Python
推荐10个CSS3 制作的创意下拉菜单效果
2014/02/11 HTML / CSS
一个精品风格的世界:Atterley
2019/05/01 全球购物
竞选班委演讲稿
2014/04/28 职场文书
结婚保证书范文
2014/04/29 职场文书
研究生求职自荐书
2014/06/23 职场文书
音乐兴趣小组活动总结
2014/07/07 职场文书
2014年后勤工作总结
2014/11/18 职场文书
如何用RabbitMQ和Swoole实现一个异步任务系统
2021/05/29 PHP