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正则的Unknown Modifier错误解决方法
Mar 02 PHP
解决phpmyadmin中缺少mysqli扩展问题的方法
May 06 PHP
php类自动加载器实现方法
Jul 28 PHP
PHP5.5迭代生成器用法实例详解
Mar 16 PHP
全面了解PHP中的全局变量
Jun 17 PHP
Thinkphp批量更新数据的方法汇总
Jun 29 PHP
yum命令安装php7和相关扩展
Jul 04 PHP
浅析php中array_map和array_walk的使用对比
Nov 20 PHP
mac系统下安装多个php并自由切换的方法详解
Apr 21 PHP
php实现的简单多进程服务器类完整示例
Feb 01 PHP
Thinkphp 框架扩展之应用模式实现方法分析
Apr 27 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
golang、python、php、c++、c、java、Nodejs性能对比
2017/03/12 NodeJs
thinkphp 验证码 的使用小结
2017/05/07 PHP
PHP基于XMLWriter操作xml的方法分析
2017/07/17 PHP
javascript编程起步(第三课)
2007/02/27 Javascript
给jqGrid数据行添加修改和删除操作链接(之一)
2011/11/04 Javascript
Js base64 加密解密介绍
2013/10/11 Javascript
Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
2013/11/14 Javascript
Javascript小技巧之生成html元素
2014/05/15 Javascript
浅析JavaScript中的对象类型Object
2016/05/26 Javascript
Vue.js对象转换实例
2017/06/07 Javascript
对angular4子路由&amp;辅助路由详解
2018/10/09 Javascript
转换layUI的数据表格中的日期格式方法
2019/09/19 Javascript
JS面向对象编程基础篇(二) 封装操作实例详解
2020/03/03 Javascript
公众号SVG动画交互实战代码
2020/05/31 Javascript
vue打包通过image-webpack-loader插件对图片压缩优化操作
2020/11/12 Javascript
Python中表达式x += y和x = x+y 的区别详解
2017/06/20 Python
Python3生成手写体数字方法
2018/01/30 Python
python实现kmp算法的实例代码
2019/04/03 Python
人工神经网络算法知识点总结
2019/06/11 Python
Python使用百度api做人脸对比的方法
2019/08/28 Python
简单了解python数组的基本操作
2019/11/26 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
2020/04/30 Python
python 实现倒计时功能(gui界面)
2020/11/11 Python
html5新增的属性和废除的属性简要概述
2013/02/20 HTML / CSS
Office DEPOT法国官网:欧迪办公用品采购
2018/01/03 全球购物
UNDONE手表官网:世界领先的定制手表品牌
2018/11/13 全球购物
Ancheer官方户外和运动商店:销售电动自行车
2019/08/07 全球购物
Python里面search()和match()的区别
2016/09/21 面试题
家长对小学生的评语
2014/01/28 职场文书
学生打架检讨书
2014/02/14 职场文书
2014年施工员工作总结
2014/11/18 职场文书
军事博物馆观后感
2015/06/05 职场文书
感恩父母主题班会
2015/08/12 职场文书
Mysql 性能监控及调优
2021/04/06 MySQL
Python 如何实现文件自动去重
2021/06/02 Python
JavaScript 原型与原型链详情
2021/11/02 Javascript