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);
?>

person Seif Elsherif    schedule 25.07.2016    source источник
comment
или дубликат stackoverflow.com/ Questions/5529306/ — на этот вопрос есть много ответов.   -  person Jim    schedule 25.07.2016


Ответы (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);

Результат:

Чудо-женщина! На-на-на-на!

person timclutton    schedule 26.07.2016