缩放水印以适应父图像


Scaling a watermark to fit parent image

我的照片大小各不相同,可以是横向、纵向或方形,我需要使水印最适合每张照片,所以我只需要调整水印的宽度(没有Imagick),因为它是一个长矩形,所以高度无关紧要。

我找到了PHP函数imagecopyresized,但老实说,即使看了PHP文档,我也不知道我的情况需要什么参数!我也不确定在使用imagecopy调整大小后,我的函数的其余部分是否能在获得水印宽度和高度的地方工作。

有人能帮我越过终点线吗。这就是我所做的,它所需要的只是添加到imagecopyresized部分的正确参数:

<?php
header('content-type: image/jpeg');
$image = imagecreatefromjpeg('https://.....jpg');
$imageSize = getimagesize('https://.....jpg');
$newWatermarkWidth = $imageSize[0]-50; // width of image minus 50px
$watermark = imagecreatefrompng('watermark.png');
// resize watermark to newWatermarkWidth here with imagecopyresize
$watermark = imagecopyresized(?,?,?,?);
$watermark_width = imagesx($watermark);
$watermark_height = imagesy($watermark);
$dest_x = ($imageSize[0]/2) - ($watermark_width/2) ;
$dest_y = ($imageSize[1]/2) - ($watermark_height/2);
imagecopy($image, $watermark, round($dest_x,0), round($dest_y,0), 0, 0, $watermark_width, $watermark_height);
imagejpeg($image);
imagedestroy($image);
imagedestroy($watermark);
?>

这就是我的结局&完美工作

调整水印宽度以适应整个父图像的脚本,居中并成比例。

<?php
header('content-type: image/jpeg');
$image = imagecreatefromjpeg('http://mydomain.com/myPhoto.jpg');
$imageSize = getimagesize('http://mydomain.com/myPhoto.jpg');
$watermark = imagecreatefrompng('http://mydomain.com/myWatermark.png');
$watermark_o_width = imagesx($watermark);
$watermark_o_height = imagesy($watermark);
$newWatermarkWidth = $imageSize[0]-20;
$newWatermarkHeight = $watermark_o_height * $newWatermarkWidth / $watermark_o_width;
imagecopyresized($image, $watermark, $imageSize[0]/2 - $newWatermarkWidth/2, $imageSize[1]/2 - $newWatermarkHeight/2, 0, 0, $newWatermarkWidth, $newWatermarkHeight, imagesx($watermark), imagesy($watermark));
imagejpeg($image);
imagedestroy($image);
imagedestroy($watermark);

这会调整水印的大小并直接复制到图像中。

您不再需要现有的图像复制行。

$success = imagecopyresized($image,                 // Destination image
           $watermark,                              // Source image
           $imageSize[0]/2 - $newWatermarkWidth/2,  // Destination X
           $imageSize[1]/2 - imagesy($watermark)/2, // Destination Y
           0,                                       // Source X
           0,                                       // Source Y
           $newWatermarkWidth,                      // Destination W
           imagesy($watermark),                     // Destination H
           imagesx($watermark),                     // Source W
           imagesy($watermark));                    // Source H