2011-09-27 17 views
7

Desidero ridimensionare un'immagine PNG con la guida di trasparenza plz. Ecco il codice:La funzione di ridimensionamento immagine PHP non funziona correttamente

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

La fonte immagine:

enter image description here

Il risultato corrente (che non voglio) è:

enter image description here

Come posso ridimensionare l'immagine e mantenere la trasparenza del colore di sfondo? Hai bisogno di aiuto, per favore. Grazie.

+1

+1 per includere le immagini. – Herbert

risposta

1

imagecopyresampled è nel posto sbagliato. Questo dovrebbe essere chiamato dopo aver impostato il colore di sfondo:

$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

Ringraziamenti per la risposta Ho provato il codice ma non funziona –

+0

Funziona per me. Stai riscontrando errori? Hai messo il codice nel posto giusto? Il mio frammento di codice dovrebbe sostituire tutto quello che hai tra '} else if ($ size [ 'mimo'] == "image/png") {' e la prossima '} else {' – megaflop

+0

E 'non funziona per me vi ho testato il codice con il logo del mio post? –

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

Spero che questo può aiutare ... io non meritano credito per questo codice ... appena trovato net op ... enjoy

Problemi correlati