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.