為什麼上傳圖片中含有透明通道,圖片就會變成黑色?

來源:互聯網
上載者:User
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事先填充的原因

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.