2010-04-10 18 views
34

Realizzo miniature utilizzando la libreria PHP e GD ma il mio codice trasforma la trasparenza png in un solido colore nero. Esiste una soluzione per migliorare il mio codice?imagecreatefrompng() Crea uno sfondo nero anziché trasparente?

questo è il mio codice PHP miniature creatore:

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

Grazie

+0

Usa sotto tutorial per Immagine ritaglio http://stackoverflow.com/questions/43409133/solved-png-image-issue-php-background-black-backround-on-resized-images –

risposta

66

Dopo 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

Hai provato a inserire tag PHP nel codice? – zaf

+0

Giusto per chiarire, nel codice sopra, '$ simage' è l'output di' imagecreatetruecolor' –

+1

ha funzionato per me per i png, ma le gif hanno ancora uno sfondo nero; inoltre non capisco il valore della seconda frase "png". È necessario? Ho provato con e senza e non ho visto differenze. –

3

A volte, se l'immagine .jpg ottenuto piccoli errori all'interno (non si può vedi quello), tutti i pixel trasparenti diventano neri. Prova a usare:

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

cambia rgb in 255, ti darà un'immagine trasparente, piuttosto che nera.

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

se il codice della risposta corretta non funzionano provate questo:

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

Per alcune immagini, è necessario riempire lo sfondo con trasparenza prima, strano, ma lavorato –

8

L'ordine delle operazioni è importante. per le immagini .gif ho scoperto che avevo bisogno di copiare prima l'immagine ridimensionata, quindi assegnare lo sfondo nero come trasparente. per i PNG ho trovato il codice sotto le immagini ridimensionate e mantenuto gli sfondi della trasparenza.

anche, questo codice ha funzionato per me ...

$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

Ecco il mio codice di prova totale. Funziona per me

$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); 
Problemi correlati