Maison >développement back-end >tutoriel php >为什么上传图片中含有透明通道,图片就会变成黑色?

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

WBOY
WBOYoriginal
2016-06-23 13:58:393354parcourir

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

<?phpclass 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;    }}


回复讨论(解决方案)

上传不会改变图片,你可以把图片贴在这里
对于 GD2 缩略图都应 imagecreatetruecolor、imagecopyresampled
如果有透明色,还需 imagecolortransparent

贴出图来看一下

贴出图来看一下





就是一张含透明通道的普通图片……


贴出图来看一下





就是一张含透明通道的普通图片……
你是怎么上传调用的,我刚才试了下你的图片,我这传完没问题

imagecreate 和 imagecreatetruecolor 产生的图片都是黑色的(注意:不是透明的)
你的图片是透明的,自然就将背景显现出来了
也就是说图片是放在黑色的背景上的了
所以被缩放的图片还需要设置透明色

$url = 'http://img.bbs.csdn.net/upload/201404/15/1397545309_839045.gif';$sm = imagecreatefromstring(file_get_contents($url));$dm = imagecreatetruecolor(imagesx($sm), imagesy($sm));//$dm = imagecreate(imagesx($sm), imagesy($sm));$c = imagecolorallocate($dm, 100, 1, 1);imagefill($dm, 0, 0, $c);imagecolortransparent($dm, $c);imagecopyresampled($dm, $sm, 0, 0, 0, 0, imagesx($dm), imagesy($dm), imagesx($sm), imagesy($sm));imagegif($dm);


我自己解决了。。还是谢谢你们,是我没有用imagefill事先填充的原因

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:PHP扩展安装之phpizeArticle suivant:提交后获取不到值