2010-04-10 29 views
34

Hago miniaturas utilizando la biblioteca PHP y GD pero mi código convierte la transparencia png en un color negro sólido. ¿Hay alguna solución para mejorar mi código?imagecreatefrompng() Hace un fondo negro en lugar de transparente?

esta es mi php código del fabricante miniatura:

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

Gracias

+0

Uso continuación tutorial para el recorte de imágenes http://stackoverflow.com/questions/43409133/solved-png-image-issue-php-background-black-backround-on-resized-images –

Respuesta

66

Después imagecreatetruecolor():

<?php 

// ... Before imagecreatetruecolor() 

$dimg = imagecreatetruecolor($width_new, $height_new); // png ?: gif 

// start changes 
switch ($stype) { 

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

    case 'png': 
     // 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($dimg, false); 

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

    default: 
     break; 
} 
// end changes 

$wm = $w/$nw; 
$hm = $h/$nh; 

// ... 
+1

¿Has intentado poner etiquetas php alrededor del código? – zaf

+0

Solo para aclarar, en el código anterior, '$ simage' es el resultado de' imagecreatetruecolor' –

+1

funcionó para mí para pngs, pero los archivos .gif todavía tienen fondo negro; tampoco entiendo el valor de la declaración del segundo caso 'png'. ¿Es eso necesario? Intenté con y sin y no vi ninguna diferencia. –

3

A veces, si la imagen .jpg consiguió pequeños errores en el interior (no se puede ver que), todos los píxeles transparentes a su vez a color.Try negro de usar:

ini_set('gd.jpeg_ignore_warning', 1); 
0

cambie rgb a 255, le dará una imagen transparente, en lugar de negro.

<?php 
switch ($stype) 
{ 
    case "png": 
     // integer representation of the color black (rgb: 0,0,0) 
     $background = imagecolorallocate($simage, 255, 255, 255); 
     // removing the black from the placeholder 
     imagecolortransparent($simage, $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($simage, false); 

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

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

     break; 
} 
?> 
4

si el código de la respuesta correcta no funcionan intente esto:

//After imagecreatetruecolor(): 
$white = imagecolorallocate($dimg, 255, 255, 255); 
imagefill($dimg,0,0,$white); 
+0

Para algunas imágenes, debe completar el fondo con transparencia primero, impar, pero trabajado –

8

El orden de las operaciones es importante. para las imágenes .gif encontré que necesitaba copiar primero la imagen redimensionada, luego asigné el fondo negro como transparente. para PNGs encontré el código debajo de las imágenes redimensionadas y mantuve los fondos de transparencia.

También, el código que funcionó para mí ...

$resized_image = imagecreatetruecolor($target_width, $target_height); 
switch ($asset->a_mime_type) 
{ 
    case 'image/jpeg': 
     imagecopyresampled($resized_image, $source, 0, 0, 0, 0, $target_width, $target_height, $asset->a_image_width, $asset->a_image_height); 
     $r = imagejpeg($resized_image,$file_name); 
     break; 
    case 'image/png': 
     imagealphablending($resized_image, FALSE); 
     imagesavealpha($resized_image, TRUE); 
     imagecopyresampled($resized_image, $source, 0, 0, 0, 0, $target_width, $target_height, $asset->a_image_width, $asset->a_image_height); 
     $r = @imagepng($resized_image,$file_name); 
     break; 
    case 'image/gif': 
     imagecopyresampled($resized_image, $source, 0, 0, 0, 0, $target_width, $target_height, $asset->a_image_width, $asset->a_image_height); 
     $background = imagecolorallocate($resized_image, 0, 0, 0); 
     imagecolortransparent($resized_image, $background); 
     $r = @imagegif($resized_image,$file_name); 
     break; 
} 
2

Aquí está mi código total de la prueba. Funciona para mí

$imageFileType = pathinfo($_FILES["image"]["name"], PATHINFO_EXTENSION); 
$filename = 'test.' . $imageFileType; 
move_uploaded_file($_FILES["image"]["tmp_name"], $filename); 

$source_image = imagecreatefromjpeg($filename); 

$source_imagex = imagesx($source_image); 
$source_imagey = imagesy($source_image); 

$dest_imagex = 400; 
$dest_imagey = 600; 
$dest_image = imagecreatetruecolor($dest_imagex, $dest_imagey); 

imagecopyresampled($dest_image, $source_image, 0, 0, 0, 0, $dest_imagex, $dest_imagey, $source_imagex, $source_imagey); 

imagesavealpha($dest_image, true); 
$trans_colour = imagecolorallocatealpha($dest_image, 0, 0, 0, 127); 
imagefill($dest_image, 0, 0, $trans_colour); 

imagepng($dest_image,"test1.png",1);