Как заменить черный фон белым при изменении размера / конвертации изображений PNG с прозрачным фоном в JPEG.

Я использую сценарий, который позволяет пользователям загружать изображения. Сценарий изменяет размер и преобразует изображения в JPEG.

Проблема заключается в том, когда загружается PNG с прозрачностью, полученный JPEG-изображение является черным, где есть прозрачность.

Как я могу отредактировать приведенный ниже сценарий, чтобы заменить черный на белый? Он уже делает это для GIF, но не для 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; } 

Я попробовал отредактировать фразу «png»: часть, чтобы соответствовать аргументу «gif»: код, но полученный JPEG полностью белый.

ОБНОВИТЬ:

Я исправил это сам.

Спасибо, всем, за вклад!

Я заменил:

 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; 

с:

 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; 

Я нашел этот другой аналогичный вопрос здесь, на этом сайте. Надеюсь, это полезно.

добавление цвета фона к прозрачным изображениям с использованием gd и php

Хорошо, эта функция от php. Поскольку я никогда не работал с изображениями на php, поэтому я этого не знал.

Итак, изображения a состоят из трех цветов: RGB (красный, зеленый, синий). В случае PNG он также состоит из другого фильтра, называемого альфа, который является прозрачностью

SO, только для PNG, вы должны переключить imagecolorallocate на imagecolorallocatealpha($file,$i,$i,$i,$i);

Это должно сделать ваши изображения прозрачными. Решает ли ваша проблема ваша проблема или вы действительно нуждаетесь в ней на белом фоне?

Edit: Я также отметил, что вы используете функцию imagejpg во всех случаях. Переключите их в соответствующую функцию, например, imagepng, imagebmp, imagegif

Попробуйте это (не проверено):

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

(предварите белый фон на $ file image)

Кроме того, for($i=0; $i<256; $i++) { imagecolorallocate($file, $i, $i, $i); } for($i=0; $i<256; $i++) { imagecolorallocate($file, $i, $i, $i); } выглядит странно.

 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] 

После изображения true color добавьте строки:

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

Это поможет почерпнуть альфа для всех форматов. Пинг, если вы не получите ответ.