将水印缩放以适应父级图像

3
我的照片大小不同,它们可以是横向、纵向或正方形的,并且我需要为每张照片制作最合适的水印 - 所以我需要调整水印的宽度(不使用Imagick),因为它是一个长方形,所以高度并不重要。
我找到了PHP函数imagecopyresized,但是说实话,即使查看了PHP文档,我也无法确定我这种情况需要哪些参数。我还不确定在使用imagecopyresized之后,我的函数的其余部分是否能够正确获取水印的宽度和高度。
有人可以帮帮我完成吗?这是我目前的进展,只需要在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);
1个回答

3
这将调整水印大小并直接复制到图像中。
您不再需要现有的imagecopy行。
$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

1
非常感谢你,Etan。这个方法确实有效,但是水印的高度缩放得不太好。它似乎拉伸了水印的宽度,但是高度没有跟上,导致水印的位置比中心高一点。有什么想法吗? - TheCarver
修复了垂直定位错误的 bug(目标 Y 坐标错误,应该使用 $imageSize[1])。 - Etan
啊,我的意思不是那样的,抱歉。我想要等比例调整大小。我的意思是水印的高度很小,所以我永远不需要设置特定的高度,因为照片总是会更大。 - TheCarver
好的,Y轴定位完美了,感谢编辑。我还需要想办法保持水印高度成比例。 - TheCarver
也许可以在我计算出新水印宽度的顶部完成这个操作。如果可以的话,我可能可以自己做到这一点,并将$newWatermarkHeight值传递给你的imagecopyresized函数。 - TheCarver
1
我成功计算出了新的比例水印高度,并且按预期工作。再次感谢。 - TheCarver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接