您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

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

2024/4/21 14:49:36发布11次查看
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事先填充的原因
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product