Я использую сценарий, который позволяет пользователям загружать изображения. Сценарий изменяет размер и преобразует изображения в 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);
Это поможет почерпнуть альфа для всех форматов. Пинг, если вы не получите ответ.