2011-09-27 24 views
7

Tôi muốn đổi kích thước hình ảnh PNG bằng trợ giúp plz trong suốt. Đây là mã:Chức năng thay đổi kích thước hình ảnh PHP không hoạt động đúng cách

function createThumb($upfile, $dstfile, $max_width, $max_height){ 
    $size = getimagesize($upfile); 
    $width = $size[0]; 
    $height = $size[1]; 
    $x_ratio = $max_width/$width; 
    $y_ratio = $max_height/$height; 
    if(($width <= $max_width) && ($height <= $max_height)) { 
      $tn_width = $width; 
      $tn_height = $height; 
    } elseif (($x_ratio * $height) < $max_height) { 
      $tn_height = ceil($x_ratio * $height); 
      $tn_width = $max_width; 
    } else { 
      $tn_width = ceil($y_ratio * $width); 
      $tn_height = $max_height; 
    } 
    if($size['mime'] == "image/jpeg"){ 
      $src = ImageCreateFromJpeg($upfile); 
      $dst = ImageCreateTrueColor($tn_width, $tn_height); 
      imagecopyresampled($dst, $src, 0, 0, 0, 0, $tn_width, $tn_height,$width, $height); 
      imageinterlace($dst, true); 
      ImageJpeg($dst, $dstfile, 100); 
    } else if ($size['mime'] == "image/png"){ 
     $src = ImageCreateFrompng($upfile); 
     $dst = ImageCreateTrueColor($tn_width, $tn_height); 
     imagecopyresampled($dst, $src, 0, 0, 0, 0, $tn_width, $tn_height,$width, $height); 

     // integer representation of the color black (rgb: 0,0,0) 
    $background = imagecolorallocate($dst, 255, 255, 0); 
    // removing the black from the placeholder 
    imagecolortransparent($dst, $background); 

    // turning off alpha blending (to ensure alpha channel information 
    // is preserved, rather than removed (blending with the rest of the 
    // image in the form of black)) 
    imagealphablending($dst, false); 

    // turning on alpha channel information saving (to ensure the full range 
    // of transparency is preserved) 
    imagesavealpha($dst, true); 


       Imagepng($dst, $dstfile); 

     } else { 

      $src = ImageCreateFromGif($upfile); 
      $dst = ImageCreateTrueColor($tn_width, $tn_height); 
      imagecopyresampled($dst, $src, 0, 0, 0, 0, $tn_width, $tn_height,$width, $height); 
      imagegif($dst, $dstfile); 
    } 
} 

Nguồn ảnh:

enter image description here

Kết quả hiện tại (mà tôi không muốn) là:

enter image description here

Làm thế nào tôi có thể thay đổi kích thước hình ảnh và duy trì độ trong suốt của màu nền? Cần giúp đỡ. Cảm ơn.

+1

+1 để bao gồm hình ảnh. – Herbert

Trả lời

1

imagecopyresampled ở sai vị trí. Điều này nên được gọi là sau bạn đã thiết lập màu nền:

$src = ImageCreateFrompng($upfile); 
$dst = ImageCreateTrueColor($tn_width, $tn_height); 

// use imagecolorallocatealpha to set BG as transparent: 
$background = imagecolorallocatealpha($dst, 255, 255, 255, 127); 

// turning off alpha blending as it's not needed 
imagealphablending($dst, false); 

// turning on alpha channel information saving (to ensure the full range 
// of transparency is preserved) 
imagesavealpha($dst, true); 

// Do this here! 
imagecopyresampled($dst, $src, 0, 0, 0, 0, $tn_width, $tn_height,$width, $height); 

Imagepng($dst, $dstfile); 
+0

Cảm ơn bạn đã trả lời Tôi đã thử mã nhưng nó không hoạt động –

+0

Làm việc cho tôi. bạn đang nhận được bất kỳ lỗi nào? Bạn đã đặt mã vào đúng vị trí chưa? Đoạn mã của tôi được cho là sẽ thay thế mọi thứ bạn có giữa '} else if ($ size ['mime'] ==" image/png ") {' và '} khác' {else – megaflop

+0

Nó không hoạt động cho tôi mã với logo của bài đăng của tôi? –

0
<?php 
function createthumb($name, $newname, $new_w, $new_h, $border=false, $transparency=true, $base64=false) { 
    if(file_exists($newname)) 
     @unlink($newname); 
    if(!file_exists($name)) 
     return false; 
    $arr = split("\.",$name); 
    $ext = $arr[count($arr)-1]; 

    if($ext=="jpeg" || $ext=="jpg"){ 
     $img = @imagecreatefromjpeg($name); 
    } elseif($ext=="png"){ 
     $img = @imagecreatefrompng($name); 
    } elseif($ext=="gif") { 
     $img = @imagecreatefromgif($name); 
    } 
    if(!$img) 
     return false; 
    $old_x = imageSX($img); 
    $old_y = imageSY($img); 
    if($old_x < $new_w && $old_y < $new_h) { 
     $thumb_w = $old_x; 
     $thumb_h = $old_y; 
    } elseif ($old_x > $old_y) { 
     $thumb_w = $new_w; 
     $thumb_h = floor(($old_y*($new_h/$old_x))); 
    } elseif ($old_x < $old_y) { 
     $thumb_w = floor($old_x*($new_w/$old_y)); 
     $thumb_h = $new_h; 
    } elseif ($old_x == $old_y) { 
     $thumb_w = $new_w; 
     $thumb_h = $new_h; 
    } 
    $thumb_w = ($thumb_w<1) ? 1 : $thumb_w; 
    $thumb_h = ($thumb_h<1) ? 1 : $thumb_h; 
    $new_img = ImageCreateTrueColor($thumb_w, $thumb_h); 

    if($transparency) { 
     if($ext=="png") { 
      imagealphablending($new_img, false); 
      $colorTransparent = imagecolorallocatealpha($new_img, 0, 0, 0, 127); 
      imagefill($new_img, 0, 0, $colorTransparent); 
      imagesavealpha($new_img, true); 
     } elseif($ext=="gif") { 
      $trnprt_indx = imagecolortransparent($img); 
      if ($trnprt_indx >= 0) { 
       //its transparent 
       $trnprt_color = imagecolorsforindex($img, $trnprt_indx); 
       $trnprt_indx = imagecolorallocate($new_img, $trnprt_color['red'], $trnprt_color['green'], $trnprt_color['blue']); 
       imagefill($new_img, 0, 0, $trnprt_indx); 
       imagecolortransparent($new_img, $trnprt_indx); 
      } 
     } 
    } else { 
     Imagefill($new_img, 0, 0, imagecolorallocate($new_img, 255, 255, 255)); 
    } 

    imagecopyresampled($new_img, $img, 0,0,0,0, $thumb_w, $thumb_h, $old_x, $old_y); 
    if($border) { 
     $black = imagecolorallocate($new_img, 0, 0, 0); 
     imagerectangle($new_img,0,0, $thumb_w, $thumb_h, $black); 
    } 
    if($base64) { 
     ob_start(); 
     imagepng($new_img); 
     $img = ob_get_contents(); 
     ob_end_clean(); 
     $return = base64_encode($img); 
    } else { 
     if($ext=="jpeg" || $ext=="jpg"){ 
      imagejpeg($new_img, $newname); 
      $return = true; 
     } elseif($ext=="png"){ 
      imagepng($new_img, $newname); 
      $return = true; 
     } elseif($ext=="gif") { 
      imagegif($new_img, $newname); 
      $return = true; 
     } 
    } 
    imagedestroy($new_img); 
    imagedestroy($img); 
    return $return; 
} 
//example useage 
createthumb("1.png", "2.png", 64,64,true, true, false); 
?> 

Hy vọng điều này có thể giúp ... Tôi không xứng đáng với tín dụng đối với mã này ... chỉ cần tìm thấy nó op ròng ... thưởng thức

Các vấn đề liên quan