PHP-GD Прозрачность водяного знака PNG неправильно объединена с JPEG

Я пытаюсь установить водяной знак в середине моего изображения, но каждый раз, когда он показывает странный квадрат, который не полностью прозрачен. Это результат моего кода:

Это мой код:

<?php
header("Content-type: image/png");

$image = imagecreatefromjpeg('http://www.sideshowtoy.com/wp-content/uploads/2016/03/dc-comics-batman-v-superman-woner-woman-sixth-scale-hot-toys-feature-902687.jpg');
$watermark = imagecreatefrompng('https://d5odq6jbm6umf.cloudfront.net/assets/img/video-play-button-transparent.png');
imagesavealpha($watermark,true);

$watermark_width = imagesx($watermark);
$watermark_height = imagesy($watermark);
$dest_x = (imagesx($image) - $watermark_width)/2;
$dest_y = (imagesy($image) - $watermark_height)/2;
imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 100);
imagejpeg($image);
imagedestroy($image);
imagedestroy($watermark);
?>

1 ответ

Решение

Я обычно создаю новый ресурс истинного цвета и копирую в него все. Это гарантирует, что GD не станет слишком причудливым. Это немного более ресурсоемко, но в большинстве случаев должно быть незначительным.

Ниже ваш код был изменен, чтобы создать новое изображение, скопировать в формате JPEG, а затем наложить частично прозрачный водяной знак:

<?php
$image = imagecreatefromjpeg('http://www.sideshowtoy.com/wp-content/uploads/2016/03/dc-comics-batman-v-superman-woner-woman-sixth-scale-hot-toys-feature-902687.jpg');
$img_w = imagesx($image);
$img_h = imagesy($image);
$new = imagecreatetruecolor($img_w, $img_h);
imagecopy($new, $image, 0, 0, 0, 0, $img_w, $img_h);
imagedestroy($image);

$watermark = imagecreatefrompng('https://d5odq6jbm6umf.cloudfront.net/assets/img/video-play-button-transparent.png');
$watermark_width = imagesx($watermark);
$watermark_height = imagesy($watermark);
$dest_x = ($img_w - $watermark_width) / 2;
$dest_y = ($img_h - $watermark_height) / 2;
imagecopy($new, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height);

header('Content-type: image/png');
imagejpeg($new);
imagedestroy($new);
imagedestroy($watermark);

Результат:

Удивительная женщина! Нет на нет на нет

Другие вопросы по тегам