2011-09-27 58 views
7

我想调整图像PNG的透明度plz帮助。下面是代码:PHP图像调整大小功能无法正常工作

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); 
    } 
} 

的图片来源:

enter image description here

目前的结果(即我不想)是:

enter image description here

我怎样才能调整图像大小并保持背景颜色的透明度?请需要帮助。谢谢。

+1

+1包括图像。 – Herbert

回答

1

imagecopyresampled是在错误的地方。这应该叫后,已设置的背景色:

$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

Thankes的答复我试了代码,但它不起作用 –

+0

适合我。你有什么错误吗?你把代码放在正确的地方吗?我的代码片段应该替代'else之间的所有内容if($ size ['mime'] ==“image/png”){'和下一个'} else {' – megaflop

+0

这不适合我代码与我的文章的标志? –

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); 
?> 

希望这可以帮助... 我不值得赞扬此代码...只是觉得运网...享受

相关问题