为什么上传图片中含有透明通道,图片就会变成黑色?

p.s. 改的图片上传类原文地址:http://blog.csdn.net/a957651480/article/details/23124257

<?php

class Images{

var $inputName;                 //控件名
var $allowType = array(
'image/gif','image/jpg','image/jpeg','image/png','image/x-png','image/pjpeg'
);                            //上传类型
var $allowSize = 1048576; //限制大小
var $saveDir = "";      //保存目录
var $FileName = ""; //文件名
var $isRename = false;               //是否重命名,默认为true
var $errID = 0;                     //错误代码,默认为0
var $errMsg = "";                   //错误信息
var $savePath = "";                 //保存路径
var $ImgSize = 0; //图片尺寸

function __construct($inputName,$allowType="",$allowSize="",$saveDir="",$isRename=true){
if(empty($inputName)){
$this->chk_err(-1);       //无传入控件名
}else{
$this->inputName = $inputName;
}

if(!empty($allowType)) $this->allowType = $allowType;
if(!empty($allowSize)) $this->allowSize = $allowSize;
if(!empty($saveDir)) $this->saveDir = $saveDir;
if(!empty($isRename)) $this->isRename = $isRename;
}

function is_uploaded(){
if(empty($_FILES[$this->inputName]['name'])){
$this->chk_err(4);    //没有文件被上传
}else{
if(is_uploaded_file($_FILES[$this->inputName]['tmp_name'])){
return true;
}else{
$this->chk_err(-2);       //文件上传不合法
}
}
}

function chk_type(){
if(!in_array($_FILES[$this->inputName]['type'],$this->allowType)){
$this->chk_err(-3);         //上传的文件类型不被允许
}else{
return true;
}
}

function chk_size(){
if($_FILES[$this->inputName]['size'] > $this->allowSize){
$this->chk_err(-4);          //上传的文件过大
}else{
return true;
}
}

function move_uploaded(){        //移动上传文件
if(!$this->is_uploaded()){
return false;
}

if(!$this->chk_size()){
return false;
}

if(!$this->chk_type()){
return false;
}

//重命名
if($this->isRename){
$arrTmp = pathinfo($_FILES[$this->inputName]['name']);
$extension = strtolower($arrTmp['extension']);
$file_newname = $this->FileName; //重命名新文件
}else{
$file_newname = $_FILES[$this->inputName]['name'];
}

if(!file_exists($this->saveDir)){       //判断保存目录是否存在
mkdir($this->saveDir,0777,true);    //建立保存目录
}

//移动文件
$result = move_uploaded_file($_FILES[$this->inputName]['tmp_name'],$this->saveDir."/".$file_newname);

if($result){
$path = $this->savePath = $this->saveDir."/".$file_newname; //文件的成功保存路径
return $path;
}else{
$this->chk_err($_FILES[$this->inputName]['error']);
}

}

//判断出错信息
function chk_err($errID){
$this->errID = $errID;

switch($this->errID){
case -4:
$this->errMsg = '只能上传1M以内的图片 | <a href="javascript:window.history.back(-1);">[返回]</a>';
break;
case -3:
$this->errMsg = '这不是一张图片 | <a href="javascript:window.history.back(-1);">[返回]</a>';
break;
case -2:
$this->errMsg = '文件上传不合法 | <a href="javascript:window.history.back(-1);">[返回]</a>';
break;
case -1:
$this->errMsg = '无控件名传入 | <a href="javascript:window.history.back(-1);">[返回]</a>';
break;
case 1:
$this->errMsg = '上传的文件超出了php.ini中upload_max_filesize设定的最大值 | <a href="javascript:window.history.back(-1);">[返回]</a>';
break;
case 2:
$this->errMsg = '上传文件的大小超过了HTML表单中MAX_FILE_SIZE选项指定的值 | <a href="javascript:window.history.back(-1);">[返回]</a>';
break;
case 3:
$this->errMsg = '文件只有部分被上传 | <a href="javascript:window.history.back(-1);">[返回]</a>';
break;
case 4:
$this->errMsg = '请选择一张图片 | <a href="javascript:window.history.back(-1);">[返回]</a>';
break;
default:
break;
}
return false;

}

function get_errMsg(){
echo $this->errMsg;  //输出错误信息
}

    /**
     +----------------------------------------------------------
     * 取得图像信息
     *
     +----------------------------------------------------------
     * @static
     * @access public
     +----------------------------------------------------------
     * @param string $image 图像文件名
     +----------------------------------------------------------
     * @return mixed
     +----------------------------------------------------------
     */
    function getImageInfo($img) {
        $imageInfo = getimagesize($img);
        if( $imageInfo!== false) {
            $imageType = strtolower(substr(image_type_to_extension($imageInfo[2]),1));
            $imageSize = filesize($img);
            $info = array(
                "width" =>$imageInfo[0],
                "height" =>$imageInfo[1],
                "type" =>$imageType,
                "size" =>$imageSize,
                "mime" =>$imageInfo['mime'],
            );
            return $info;
        }else {
            return false;
        }
    }

/**
     +----------------------------------------------------------
     * 生成缩略图
     +----------------------------------------------------------
     * @static
     * @access public
     +----------------------------------------------------------
     * @param string $image  原图
     * @param string $type 图像格式
     * @param string $thumbname 缩略图文件名
     * @param string $maxWidth  宽度
     * @param string $maxHeight  高度
     * @param string $position 缩略图保存目录
     * @param boolean $interlace 启用隔行扫描
     * @param boolean $is_save 是否保留原图
     +----------------------------------------------------------
     * @return void
     +----------------------------------------------------------
     */
 
    function thumb($image,$is_save=true,$suofang=0,$type='',$maxWidth=500,$maxHeight=500,$interlace=true){
        // 获取原图信息
       $info  = $this->getImageInfo($image);
         if($info !== false) {
            $srcWidth  = $info['width'];
            $srcHeight = $info['height'];
            $type = empty($type)?$info['type']:$type;
$type = strtolower($type);
            $interlace  =  $interlace? 1:0;
            unset($info);
            if ($suofang==1) {
                $width  = $srcWidth;
                $height = $srcHeight;
            } else {
                $scale = min($maxWidth/$srcWidth, $maxHeight/$srcHeight); // 计算缩放比例
                if($scale>=1) {
                    // 超过原图大小不再缩略
                    $width   =  $srcWidth;
                    $height  =  $srcHeight;
                }else{
                    // 缩略图尺寸
                    $width  = (int)($srcWidth*$scale); //147
                    $height = (int)($srcHeight*$scale); //199
                }
            }
            // 载入原图
            $createFun = 'ImageCreateFrom'.($type=='jpg'?'jpeg':$type);
            $srcImg     = $createFun($image);

            //创建缩略图
            if($type!='gif' && function_exists('imagecreatetruecolor'))
                $thumbImg = imagecreatetruecolor($width, $height);
            else
                $thumbImg = imagecreate($width, $height);

            // 复制图片
            if(function_exists("ImageCopyResampled"))
                imagecopyresampled($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height, $srcWidth,$srcHeight);
            else
                imagecopyresized($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height,  $srcWidth,$srcHeight);
            if('gif'==$type || 'png'==$type) {
                //imagealphablending($thumbImg, false);//取消默认的混色模式
                //imagesavealpha($thumbImg,true);//设定保存完整的 alpha 通道信息
                $background_color  =  imagecolorallocate($thumbImg,  0,255,0);  //  指派一个绿色
imagecolortransparent($thumbImg,$background_color);  //  设置为透明色,若注释掉该行则输出绿色的图
            }
            // 对jpeg图形设置隔行扫描
            if('jpg'==$type || 'jpeg'==$type)  imageinterlace($thumbImg,$interlace);
            //$gray=ImageColorAllocate($thumbImg,255,0,0);
            //ImageString($thumbImg,2,5,5,"ThinkPHP",$gray);

            // 生成图片
            $imageFun = 'imagejpeg'; 
$length = strlen("00.".$type) * (-1);
$_type = substr($image,-4);
$length = ($type != $_type ? $length+1 : $length);

            //裁剪
            if ($suofang == 1){

//$thumbname01 = substr_replace($image,"01.".$type,$length); //大头像
$thumbname02 = substr_replace($image,'.gif',-8); //小头像
//$imageFun($thumbImg,$thumbname01,100);
$imageFun($thumbImg,$thumbname02,100);

                //$thumbImg01 = imagecreatetruecolor(190,195);
                //imagecopyresampled($thumbImg01,$thumbImg,0,0,$_POST['x'],$_POST['y'],190,195,$_POST['w'],$_POST['h']);

$thumbImg02 = imagecreatetruecolor($this->ImgSize,$this->ImgSize);
                imagecopyresampled($thumbImg02,$thumbImg,0,0,$_POST['x'],$_POST['y'],$this->ImgSize,$this->ImgSize,$_POST['w'],$_POST['h']);

//$imageFun($thumbImg01,$thumbname01,100);
$imageFun($thumbImg02,$thumbname02,100);

unlink($image);

//imagedestroy($thumbImg01);
imagedestroy($thumbImg02);
imagedestroy($thumbImg);
imagedestroy($srcImg);

return array(/*'big' => $thumbname01 ,*/ 'small' => $thumbname02); //返回包含大小头像路径的数组

            }else{
if($is_save == false){ //缩略图覆盖原图,缩略图的路径还是原图路径
$imageFun($thumbImg,$image,100);
}else{
$thumbname03 = $image; //缩略图与原图同时存在,
$imageFun($thumbImg,$thumbname03,100);

imagedestroy($thumbImg);
imagedestroy($srcImg);
return $thumbname03 ; //返回缩略图的路径,字符串
}
}

         }
         return false;
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值