Как заменить черный фон белым при изменении размера / преобразовании изображений PNG с прозрачным фоном в JPEG. - PullRequest
19 голосов
/ 16 апреля 2011

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

Я попытался отредактировать часть case "png": , чтобы она соответствовала части кода case "gif": , но полученный JPEG полностью белый.

UPDATE

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

Спасибо всем за помощь!

Я заменил:

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;

Ответы [ 5 ]

2 голосов
/ 05 ноября 2013
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]
1 голос
/ 14 февраля 2014

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

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

0 голосов
/ 13 января 2014

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

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

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

0 голосов
/ 17 апреля 2011

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

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

(нарисуйте белый фон на изображении $ file)

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

0 голосов
/ 17 апреля 2011

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

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

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

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

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

...