2010-04-30 3 views
1

J'utilise cette fonction pour redimensionner des images mais je me retrouve avec une image terrifiante avec un fond noir s'il s'agit d'un GIF ou PNG transparent avec alpha, mais cela fonctionne parfaitement pour jpg et png normal.Comment améliorer mon resizer d'image php pour supporter alpha png et GIF transparents

function cropImage($nw, $nh, $source, $stype, $dest) { 
    $size = getimagesize($source); 
    $w = $size[0]; 
     $h = $size[1]; 

     switch($stype) { 
      case 'gif': 
      $simg = imagecreatefromgif($source); 
      break; 
      case 'jpg': 
      $simg = imagecreatefromjpeg($source); 
      break; 
      case 'png': 
      $simg = imagecreatefrompng($source); 
      break; 
     } 


    $dimg = imagecreatetruecolor($nw, $nh); 

    switch ($stype) 
    { 
     case "png": 

    imagealphablending($dimg, false); 
    imagesavealpha($dimg, true); 
    $transparent = imagecolorallocatealpha($dimg, 255, 255, 255, 127); 
    imagefilledrectangle($dimg, 0, 0, $nw, $nh, $transparent); 

    break; 
case "gif": 
    // integer representation of the color black (rgb: 0,0,0) 
    $background = imagecolorallocate($simg, 0, 0, 0); 
    // removing the black from the placeholder 
    imagecolortransparent($simg, $background); 

    break; 
    } 



     $wm = $w/$nw; 
     $hm = $h/$nh; 
     $h_height = $nh/2; 
     $w_height = $nw/2; 

     if($w> $h) { 
      $adjusted_width = $w/$hm; 
      $half_width = $adjusted_width/2; 
      $int_width = $half_width - $w_height; 
      imagecopyresampled($dimg,$simg,-$int_width,0,0,0,$adjusted_width,$nh,$w,$h); 
     } elseif(($w <$h) || ($w == $h)) { 
      $adjusted_height = $h/$wm; 
      $half_height = $adjusted_height/2; 
      $int_height = $half_height - $h_height; 

    imagecopyresampled($dimg,$simg,0,-$int_height,0,0,$nw,$adjusted_height,$w,$h); 
     } else { 
      imagecopyresampled($dimg,$simg,0,0,0,0,$nw,$nh,$w,$h); 
     } 

     imagejpeg($dimg,$dest,100); 
    } 

Exemple: cropImage("300","200","original.png","png","new.png");

J'utilise PHP 5.3.2 et la bibliothèque GD fourni (compatible 2.0.34)

Comment faire soutenir la transparence? J'ai ajouté imagealphablending() et imagesavealpha mais cela n'a pas fonctionné. Ou atlast y at-il d'autres classes similaires?

Merci

Répondre

1

Le fond noir laid disparaît si vous envoyez l'image en png. Voici donc les deux solutions de rechange, à la fois testées:

  1. Si vous pouvez enregistrer la vignette au format PNG, il suffit de faire: le changement imagejpeg($dimg,$dest,100);-imagepng($dimg,$dest);

  2. S'il est important de le stocker sous forme jpeg, supprimer les lignes imagealphablending($dimg, false); et imagesavealpha($dimg, true); - les valeurs par défaut true et false, respectivement, fourniront l'effet désiré. La désactivation du mélange alpha n'a de sens que si l'image du résultat possède également un canal alpha.

0

Je n'ai pas testé moi-même, mais ce fut une idée que j'ai eu pour faire exactement cela lorsque vous travaillez sur un projet de la mine.

D'abord, trouver une couleur qui ne sert pas à l'image et créer une nouvelle image avec ce que l'arrière-plan (vert vraiment flashy par exemple, comme ils le font avec la capture de mouvement)

Ensuite, copiez votre image avec transparence dessus (je sais que cela fonctionne avec PHP je faisais ceci pour mettre des bordures sur des images)

Ensuite, utilisez la fonction imagecolortransparent pour définir quelle couleur dans cette image est transparente et lui donner votre couleur verte flashy.

Je pense que cela fonctionnerait mais je ne l'ai pas testé.

Questions connexes