欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

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

程序员文章站 2022-05-06 15:04:44
...
p.s. 改的图片上传类原文地址:http://blog.csdn.net/a957651480/article/details/23124257

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以内的图片 | [返回]';				break;			case -3:				$this->errMsg = '这不是一张图片 | [返回]';				break;			case -2:				$this->errMsg = '文件上传不合法 | [返回]';				break;			case -1:				$this->errMsg = '无控件名传入 | [返回]';				break;			case 1:				$this->errMsg = '上传的文件超出了php.ini中upload_max_filesize设定的最大值 | [返回]';				break;			case 2:				$this->errMsg = '上传文件的大小超过了HTML表单中MAX_FILE_SIZE选项指定的值 | [返回]';				break;			case 3:				$this->errMsg = '文件只有部分被上传 | [返回]';				break;			case 4:				$this->errMsg = '请选择一张图片 | [返回]';				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事先填充的原因