PHP imagecopy 函数根据主图像的高度和宽度改变图章大小

Posted

技术标签:

【中文标题】PHP imagecopy 函数根据主图像的高度和宽度改变图章大小【英文标题】:PHP imagecopy function changing stamp size according to the main image height and width 【发布时间】:2019-03-30 14:45:00 【问题描述】:

我正在尝试为每个上传到网站的图片添加水印(徽标)。

所以,我使用 imagecopy php 函数将水印(png 图像)添加到主图像(jpg 图像),但问题是徽标大小会根据主图像大小(高度和宽度)而变化,那就是意思是如果我上传一张 4000x2000 的图片,则徽标的大小类似于 100x100,如果主图片尺寸为 1000x500,则印章将大于实际尺寸 (546x537)。

图像样本:

https://crkemlak.com/appimg/199f8486d7d77007771f2f450dffca4d.jpeg
https://crkemlak.com/appimg/d6f9fd02999eced76eac9a6995df904f.jpeg
https://crkemlak.com/img/stamp.png

我使用此代码将水印添加到图像:

$im = imagecreatefromjpeg('../appimg/'.$filenamerand);

$originalWidth= imagesx($im);
$originalHeight = imagesy($im);

$stamp = imagecreatefrompng('../img/stamp.png');
$marge_right = 10;
$marge_bottom = 10;
$sx = imagesx($stamp);
$sy = imagesy($stamp);
imagecopy($im, $stamp, ($originalWidth-$sx)/2, ($originalHeight-$sy)/2, 0, 0, imagesx($stamp), imagesy($stamp));

我需要你的帮助来解决这个问题,我需要让水印在任何尺寸的主 jpg 图像中都是真实尺寸

谢谢

【问题讨论】:

编写一个以原始图像大小为参数的函数,然后使用它来调整水印的大小,然后输出水印以与源图像合并。然后你的源图像的大小根本不会改变(除非你当然想要它)。 @Difster 你能给我一个例子吗? @GhadeerR.Majeed 我不明白逻辑,如果主图像更大,印章会更小?您可以上传一些带有图片的工作示例吗? @PaulRM 我更新了帖子,请立即查看。谢谢。 我得到了 403 并把邮票的链接也放了。 ;-) 【参考方案1】:

我使用了imagecopyresized,这样无论大小如何,水印都可以缩放到任何输入图像上看起来都一样。可能有更好的方法来做到这一点。我不确定缩放具有透明背景的图像时质量有多好。这里是git

$watermark = imagecreatefrompng('watermark.png');
$image = imagecreatefromjpeg('main-image.jpg');

$wm_x = imagesx($watermark);
$wm_y = imagesy($watermark);
$img_x = imagesx($image);
$img_y = imagesy($image);

// calculate watermark size
$wm_scale = 19; // set size in relation to image
$wm_w = $img_x/$wm_scale;
$wm_aspect = $wm_y/$wm_x;
$wm_h = (int) ($wm_aspect * $wm_w);

// calculate margin
$margin_scale = 6; // set margin in relation to new watermark size
$margin_right = $wm_w/$margin_scale;
$margin_bottom = $wm_h/$margin_scale;

// calculate watermark destination
$dst_x = $img_x - $wm_w - $margin_right;
$dst_y = $img_y - $wm_h - $margin_bottom;

imagecopyresized ($image, $watermark, $dst_x, $dst_y, 0, 0, $wm_w, $wm_h, $wm_x, $wm_y);

// Output and free memory
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);

【讨论】:

以上是关于PHP imagecopy 函数根据主图像的高度和宽度改变图章大小的主要内容,如果未能解决你的问题,请参考以下文章

PHP GD 方法 imagecopy 比原始图像更大的图像文件

imagecopy() 上的 PHP GD 图像损坏

在 PHP 中使用 imagecopy 时如何使任何“额外空间”变白

2-13图像处理之水印和验证码

PHP实现的自定义图像居中裁剪函数示例

将图片绘制到画布上:imagecopy()