2011-09-27 4 views
7

transparence plz help로 이미지 PNG의 크기를 조정하고 싶습니다.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

답장을 보내 주셔서 감사합니다. 코드를 시도했지만 작동하지 않습니다. –

+0

저에게 맞습니다. 오류가 있습니까? 코드를 올바른 위치에 놓았습니까? 내 코드 스 니펫은 {}와 {} 사이에있는 모든 것을 대체하기로되어 있습니다 else {($ 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); 
?> 

희망 ... 가이 코드에 대한 크레딧을받을 자격이 그나마 ... 그냥 연산 그물을 발견 ... 이미지 포함을 위해