Come sostituire lo background nero con il bianco quando ridimensionate / convertite immagini PNG con sfondi trasparenti in JPEG.

Sto usando uno script che consente agli utenti di caricare immagini. Lo script ridimensiona e converte le immagini in JPEG.

Il problema che ho è quando viene caricato un PNG con trasparenza, l'image JPEG risultante è nera where c'era trasparenza.

Come posso modificare lo script seguente per sostituire il nero con il bianco? Lo fa già per GIF ma non per PNG.

// RESIZE IMAGE AND PUT IN USER DIRECTORY switch($this->file_ext) { case "gif": $file = imagecreatetruecolor($width, $height); $new = imagecreatefromgif($this->file_tempname); $kek=imagecolorallocate($file, 255, 255, 255); imagefill($file,0,0,$kek); imagecopyresampled($file, $new, 0, 0, 0, 0, $width, $height, $this->file_width, $this->file_height); imagejpeg($file, $photo_dest, 100); ImageDestroy($new); ImageDestroy($file); break; case "bmp": $file = imagecreatetruecolor($width, $height); $new = $this->imagecreatefrombmp($this->file_tempname); for($i=0; $i<256; $i++) { imagecolorallocate($file, $i, $i, $i); } imagecopyresampled($file, $new, 0, 0, 0, 0, $width, $height, $this->file_width, $this->file_height); imagejpeg($file, $photo_dest, 100); ImageDestroy($new); ImageDestroy($file); break; case "jpeg": case "jpg": $file = imagecreatetruecolor($width, $height); $new = imagecreatefromjpeg($this->file_tempname); for($i=0; $i<256; $i++) { imagecolorallocate($file, $i, $i, $i); } imagecopyresampled($file, $new, 0, 0, 0, 0, $width, $height, $this->file_width, $this->file_height); imagejpeg($file, $photo_dest, 100); ImageDestroy($new); ImageDestroy($file); break; case "png": $file = imagecreatetruecolor($width, $height); $new = imagecreatefrompng($this->file_tempname); for($i=0; $i<256; $i++) { imagecolorallocate($file, $i, $i, $i); } imagecopyresampled($file, $new, 0, 0, 0, 0, $width, $height, $this->file_width, $this->file_height); imagejpeg($file, $photo_dest, 100); ImageDestroy($new); ImageDestroy($file); break; } chmod($photo_dest, 0777); return true; } 

Ho provato a modificare il caso "png": porzione per corrispondere a quella del caso "gif": codice ma il JPEG risultante è completamente bianco.

AGGIORNARE:

L'ho riparato da solo.

Grazie a tutti per aver contribuito!

Ho sostituito:

 case "png": $file = imagecreatetruecolor($width, $height); $new = imagecreatefrompng($this->file_tempname); for($i=0; $i<256; $i++) { imagecolorallocate($file, $i, $i, $i); } imagecopyresampled($file, $new, 0, 0, 0, 0, $width, $height, $this->file_width, $this->file_height); imagejpeg($file, $photo_dest, 100); ImageDestroy($new); ImageDestroy($file); break; 

con:

 case "png": $file = imagecreatetruecolor($width, $height); $new = imagecreatefrompng($this->file_tempname); $kek=imagecolorallocate($file, 255, 255, 255); imagefill($file,0,0,$kek); imagecopyresampled($file, $new, 0, 0, 0, 0, $width, $height, $this->file_width, $this->file_height); imagejpeg($file, $photo_dest, 100); ImageDestroy($new); ImageDestroy($file); break; 

Ho trovato questa altra domanda simile qui su questo sito. Spero sia utile.

aggiungere colore di background alle immagini trasparenti usando gd e php

Ok, questa function è da php. Come non ho mai lavorato con le immagini su PHP, quindi non lo sapevo.

Quindi, le immagini sono composte da tre colors: RGB (rosso, verde, blu). In caso di PNG, è anche composto da un altro filter, chiamato alfa, che è la trasparenza

Quindi, solo per PNG, dovresti cambiare imagecolorallocate in imagecolorallocatealpha($file,$i,$i,$i,$i);

Questo dovrebbe rendere le tue immagini trasparenti. Questo risolve il tuo problema o ne hai davvero bisogno in uno background bianco?

Modifica: ho anche notato che stai usando la function imagejpg in tutti i casi. Passali alla function corrispondente, ad esempio imagepng, imagebmp, imagegif

Prova in questo modo (non testato):

 case "png": $file = imagecreatetruecolor($width, $height); $new = imagecreatefrompng($this->file_tempname); imagefilledrectangle ($file, 0, 0, $width, $height, imagecolorallocate($file, 0,0,0)) 

(predraw uno background bianco su $ image del file)

Inoltre, for($i=0; $i<256; $i++) { imagecolorallocate($file, $i, $i, $i); } for($i=0; $i<256; $i++) { imagecolorallocate($file, $i, $i, $i); } parte sembra strana.

 switch($image_extension){ case 'gif': case 'GIF': $image_orig_resource = imagecreatefromgif($image_orig_path); break; case 'png': case 'PNG': $image_orig_resource = imagecreatefrompng($image_orig_path); break; case 'jpg': case 'jpeg': case 'JPG': case 'JPEG': $image_orig_resource = imagecreatefromjpeg($image_orig_path); break; default: throw new Exception('Extension not supported'); } $image_resource = imagecreatetruecolor($width, $height); imagefill($image_resource, 0, 0, imagecolorallocate($image_resource, 255, 255, 255)); // white background; imagecopyresampled($image_resource, $image_orig_resource, 0, 0, 0, 0, $width, $height, $image_orig_width, $image_orig_height); imagejpeg($image_resource, $image_path, 100); // quality: [0-100] 

Dopo l'image il vero colore aggiunge le linee:

  $file = imagecreatetruecolor($width, $height); $background = imagecolorallocate($file, 0, 0, 0); imagecolortransparent($file, $background); imagealphablending($file, false); imagesavealpha($file, true); 

Questo aiuterà a spedire l'alfa per tutti i formati. Ping se non si ottiene risposta.