Объединить 2 изображения одинакового размера с GD - PullRequest
0 голосов
/ 18 сентября 2018

Я просматривал руководство php, но безуспешно, чтобы заставить его работать 1 прозрачное изображение поверх другого изображения .jpg

$image1 = imagecreatefromjpeg('image.jpg'); 
$image2 = imagecreatefrompng('watermark.png');

imagecopy($image1, $image2, 0, 0, 0, 0, imagesx($image1), imagesy($image1)); 

imagejpeg($image1, "ok.jpg");    

echo "<img src='ok.jpg' alt='test' >";

Два изображения имеют одинаковый размер, единственное отличие, а второе изображение прозрачноеи имеет логотип в определенной позиции

эхо печатает только первое изображение

РЕДАКТИРОВАТЬ

imagecopymerge

 $image1 = imagecreatefromjpeg('image.jpg'); 
    $image2 = imagecreatefrompng('watermark.png');

    imagecopymerge($image1, $image2, 0, 0, 0, 0, imagesx($image1), imagesy($image1, 5)); 

    imagejpeg($image1, "ok.jpg");    

    echo "<img src='ok.jpg' alt='test' >";

ИЗОБРАЖЕНИЯ

watermarker.png watermarker.png

image.jpg image.jpg

ok.jpg - это должен быть результат, но при создании файла появляется только футболка ok.jpg ok.jpg - This should be the result, but only the T-shirt appears when it generates the file ok.jpg

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Вы можете попытаться изменить местоположение логотипа / водяного знака.

Вам просто нужно получить координаты (левый и верхний) четырех углов в watermark.png и сместить их на четыре координаты image.jpg:

$image = new Imagick('image.jpg');
$watermark = new Imagick('watermark.png');
$controlPoints = [
    300,1700 /* watermark.png (left,top) coordinate moves to image.jpg (left,top) coordinate */ 800,900, // TOP LEFT CORNER
    1963,1700, /* to */ 1450,900, // TOP RIGHT CORNER
    1963,2500, /* to */ 1450,1100, // BOTTOM RIGHT CORNER
    300,2500, /* to */ 800,1100, // BOTTOM LEFT CORNER
];
$watermark->distortImage(Imagick::DISTORTION_BILINEAR, $controlPoints, false);
$image->addImage($watermark);
$result = $image->mergeImageLayers(Imagick::LAYERMETHOD_MERGE);
echo '<img src="data:image/jpg;base64,'. base64_encode($result->getImageBlob()) . '" alt="test" />';

Вы можете играть свободнос контрольными точками.

Но будьте осторожны , если вы используете изображения с разными размерами, потому что если одна из координат назначения выходит за пределы размера изображения для искажения (водяной знак), вы должны изменить на:

$watermark->distortImage(Imagick::DISTORTION_PERSPECTIVE, $controlPoints, true);

Вы должны изменить первый и третий аргументы.

0 голосов
/ 19 сентября 2018

Эта функция должна быть вам полезна http://php.net/manual/en/function.imagecopymerge.php

...