2012-08-26 122 views
0

我使用此代碼上傳圖像到我的服務器。但由於某種原因,我的縮略圖會變成黑色背景,而不是像原來那樣透明。 http://www.akemapa.com/2008/07/10/php-gd-resize-transparent-image-png-gif/使調整大小的圖像透明

但沒有成功:

我已經使用這個 「指南」 嘗試。我不知道如何將這段代碼實現到我使用的代碼中。

如果有人可以幫助,請這樣做:)

<?php 
    //define a maxim size for the uploaded images 
    define ("MAX_SIZE","10240"); 
    // define the width and height for the thumbnail 
    // note that theese dimmensions are considered the maximum dimmension and are not fixed, 
    // because we have to keep the image ratio intact or it will be deformed 
define ("WIDTH","200"); 
define ("HEIGHT","200"); 

    // this is the function that will create the thumbnail image from the uploaded image 
// the resize will be done considering the width and height defined, but without deforming the image 
function make_thumb($img_name,$filename,$new_w,$new_h) 
{ 
    //get image extension. 
    $ext=getExtension($img_name); 
    //creates the new image using the appropriate function from gd library 
    if(!strcmp("jpg",$ext) || !strcmp("jpeg",$ext)) 
     $src_img=imagecreatefromjpeg($img_name); 

    if(!strcmp("png",$ext)) 
     $src_img=imagecreatefrompng($img_name); 

    if(!strcmp("gif",$ext)) 
     $src_img=imagecreatefromgif($img_name); 

     //gets the dimmensions of the image 
    $old_x=imageSX($src_img); 
    $old_y=imageSY($src_img); 

    // next we will calculate the new dimmensions for the thumbnail image 
    // the next steps will be taken: 
    // 1. calculate the ratio by dividing the old dimmensions with the new ones 
    // 2. if the ratio for the width is higher, the width will remain the one define in WIDTH variable 
    //  and the height will be calculated so the image ratio will not change 
    // 3. otherwise we will use the height ratio for the image 
    // as a result, only one of the dimmensions will be from the fixed ones 
    $ratio1=$old_x/$new_w; 
    $ratio2=$old_y/$new_h; 
    if($ratio1>$ratio2) { 
     $thumb_w=$new_w; 
     $thumb_h=$old_y/$ratio1; 
    } 
    else { 
     $thumb_h=$new_h; 
     $thumb_w=$old_x/$ratio2; 
    } 

    // we create a new image with the new dimmensions 
    $dst_img=ImageCreateTrueColor($thumb_w,$thumb_h); 

    // resize the big image to the new created one 
    imagecopyresampled($dst_img,$src_img,0,0,0,0,$thumb_w,$thumb_h,$old_x,$old_y); 
    // output the created image to the file. Now we will have the thumbnail into the file named by $filename 
    if(!strcmp("png",$ext)) 
     imagepng($dst_img,$filename); 

    else 
     imagejpeg($dst_img,$filename); 
     imagegif($dst_img,$filename); 

    //destroys source and destination images. 
    imagedestroy($dst_img); 
    imagedestroy($src_img); 
} 

// This function reads the extension of the file. 
// It is used to determine if the file is an image by checking the extension. 
function getExtension($str) { 
     $i = strrpos($str,"."); 
     if (!$i) { return ""; } 
     $l = strlen($str) - $i; 
     $ext = substr($str,$i+1,$l); 
     return $ext; 
} 

// This variable is used as a flag. The value is initialized with 0 (meaning no error found) and it will be changed to 1 if an errro occures. If the error occures the file will not be uploaded. 
$errors=0; 
// checks if the form has been submitted 
if(isset($_POST['Submit'])) 
{ 
//reads the name of the file the user submitted for uploading 
    $image=$_FILES['image']['name']; 
    // if it is not empty 
    if ($image) 
    { 
     // get the original name of the file from the clients machine 
     $filename = stripslashes($_FILES['image']['name']); 

     // get the extension of the file in a lower case format 
     $extension = getExtension($filename); 
     $extension = strtolower($extension); 
     // if it is not a known extension, we will suppose it is an error, print an error message and will not upload the file, otherwise we continue 
     if (($extension != "jpg") && ($extension != "jpeg") && ($extension != "png") && ($extension != "gif")) 
     { 
      echo '<h1>Unknown extension!</h1>'; 
      $errors=1; 
     } 
     else 
     { 
      // get the size of the image in bytes 
      // $_FILES[\'image\'][\'tmp_name\'] is the temporary filename of the file in which 
      //the uploaded file was stored on the server 
      $size=getimagesize($_FILES['image']['tmp_name']); 
      $sizekb=filesize($_FILES['image']['tmp_name']); 

      //compare the size with the maxim size we defined and print error if bigger 
      if ($sizekb > MAX_SIZE*10240) 
      { 
       echo '<h1>You have exceeded the size limit!</h1>'; 
       $errors=1; 
      } 

      //we will give an unique name, for example the time in unix time format 
      $image_name=time().'.'.$extension; 
      //the new name will be containing the full path where will be stored (images folder) 
      $newname="../images/uploads/".$image_name; 
      $copied = copy($_FILES['image']['tmp_name'], $newname); 
      //we verify if the image has been uploaded, and print error instead 
      if (!$copied) 
      { 
       echo '<h1>Copy unsuccessfull!</h1>'; 
       $errors=1; 
      } 
      else 
      { 
       // the new thumbnail image will be placed in images/thumbs/ folder 
       $thumb_name='../images/uploads/thumbs/thumb_'.$image_name; 
       // call the function that will create the thumbnail. The function will get as parameters the image name, the thumbnail name and the width and height desired for the thumbnail 
       $thumb=make_thumb($newname,$thumb_name,WIDTH,HEIGHT); 
      }} }} 
+0

這個「指南」實際上相當酷 - 你是否理解你的「自己」的代碼? – Gutza

+0

順便說一句,imagecreatefromstring檢測圖像類型,而檢查類型與擴展而不是MIME類型不是一個多平臺友好(可以這麼說)的想法。 – Bugs

回答

0

嘗試包括imagesavealpha()爲PNG的

if(!strcmp("png",$ext)) 
{ 
    $src_img=imagecreatefrompng($img_name); 
    imagesavealpha($src_img, true); 
} 

,並讀入imagecolortransparent() GIF文件,看看是否可以在這裏找到一個解決方案,雖然凌亂。

+0

我很抱歉,但我無法讓它工作。 PNG仍然黑色背景。我在「使用gd library的相應功能創建新圖像」中添加了它。 – NizeGuy