PHP GD: черный становится прозрачным

На моем сайте пользователи могут загружать 3 изображения с любым соотношением, и я хочу создать анимированный GIF с 3 миниатюрами.
Поскольку соотношение может быть различным, анимированный GIF должен иметь:

  • Ширина X: максимальная ширина любого из 3 изображений
  • Высота Y: максимальная высота любого из 3 изображений

Поэтому я создаю 3 эскиза max_width x max_height с прозрачным фоном, затем центрирую уменьшенное изображение внутри.

Меня беспокоит то, что глубокий черный цвет становится прозрачным:

введите описание изображения здесь

Вот код, вдохновленный одним из ответов Михая Иорги:

  foreach ($jpg_files as $key => $photo) {
// Identification de largeur et hauteur max des vignettes, pour centrage ultérieur
$thumb_w = $w_array[$key];
$thumb_h = $h_array[$key];
list($w_orig, $h_orig) = getimagesize($photo);

if($thumb_w> $thumb_h) {
$off_y=ceil(($max_thumb_h-$thumb_h)/2);
$off_x=0;
} elseif($thumb_h> $thumb_w) {
$off_x=ceil(($max_thumb_w-$thumb_w)/2);
$off_y=0;
}
else {
$off_x=$off_y=0;
}

// Création des vignettes GIF centrées sur fond transparent
$src = "";
$src = imagecreatefromjpeg($photo);
$new_img = imagecreatetruecolor($max_thumb_w, $max_thumb_h);
imagealphablending($new_img, false);
imagesavealpha($new_img, true);
imagecopyresampled($new_img, $src, $off_x, $off_y, 0, 0, $thumb_w, $thumb_h, $w_orig, $h_orig);

// create a new image with max size
$maxsize = imagecreatetruecolor($max_thumb_w, $max_thumb_h);

// add 1x1 gif and resize, then copy over $maxsize
$background = imagecreatefromgif('images/1pix_transparent.gif'); // transparent 1x1 gif
imagecopyresampled($maxsize, $background, 0, 0, 0, 0, $max_thumb_w, $max_thumb_h, 1, 1);

// allocate transparency
$transparent = imagecolortransparent($maxsize);
$transparent_index = imagecolorallocate($maxsize, $transparent['red'], $transparent['green'], $transparent['blue']);
imagecolortransparent($maxsize, $transparent_index);

// image copy
//imagecopymerge($maxsize, $new_img, 0, 0, 0, 0, $max_thumb_w, $max_thumb_h, 100);
imagecopy($maxsize, $new_img, 0, 0, 0, 0, $max_thumb_w, $max_thumb_h);

// save
imagegif($maxsize, $uploadDir.'/thumb_'.$NewFileNameNoExt.$key.'.gif');

// destroy temp images
imagedestroy($maxsize);
imagedestroy($new_img);
imagedestroy($background);
imagedestroy($src);

array_push($gif_array, $uploadDir.'/thumb_'.$NewFileNameNoExt.$key.'.gif');
$framed[$key] = 150;
}

$thumbName = $uploadDir.'/thumb_'.$NewFileNameLeft.'.gif';
include "includes/GIFEncoder.class.php";
$gif = new GIFEncoder($gif_array, $framed, 0, 2, 0, 0, 0, "url");
fwrite(fopen($thumbName, "wb"),$gif->GetAnimation());

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector