【发布时间】:2014-01-10 14:30:03
【问题描述】:
我已经拼凑了一个 PHP 类来使用 PHP 的 GD 函数来执行各种与图像相关的功能。
它适用于所有图像类型。旋转、翻转、调整大小、裁剪以及在较小程度上添加水印。
除了后者之外,其他都可以完美运行。例如,经过一些更改后,旋转的 PNG 图像保留了它们的透明度,而在它们失去透明度之前,背景变黑了。常见问题,出现了。但现在一切正常。
我仍然卡住的地方是用另一个 PNG 图像为 PNG 图像加水印。它似乎适用于 JPG 和其他图像。这是代码(简化):
public function writeWatermarkSimple()
{
$watermarkFile = 'watermark.png';
$watermarkImage = imagecreatefrompng($watermarkFile);
imagealphablending($watermarkImage, false);
imagesavealpha($watermarkImage, true);
$imageFile = 'image.png';
$baseImage = imagecreatefrompng($imageFile);
imagealphablending($baseImage, false);
imagesavealpha($baseImage, true);
$marginH = imagesx($baseImage) - imagesx($watermarkImage);
$marginV = imagesy($baseImage) - imagesy($watermarkImage);
$cut = imagecreatetruecolor(imagesx($watermarkImage), imagesy($watermarkImage));
imagecopy($cut, $baseImage, 0, 0, $marginH, $marginV, imagesx($watermarkImage), imagesy($watermarkImage));
imagecopy($cut, $watermarkImage, 0, 0, 0, 0, imagesx($watermarkImage), imagesy($watermarkImage));
imagecopymerge($baseImage, $cut, $marginH, $marginV, 0, 0, imagesx($watermarkImage), imagesy($watermarkImage), 80);
if (!imagepng($baseImage, 'watermarked_image.png'))
{
return false;
}
return true;
}
这是与人们基于类似问题提供的各种指南和建议拼凑而成的。同样,可以完美地处理 JPG 图像和 PNG 水印,但不能处理 PNG 和 PNG。
一些示例图片:
http://i.imgur.com/hHRWinj.png - 这是我正在使用的水印。 http://i.imgur.com/6sy8Ncs.png - 这是我要应用水印的图像。 http://i.imgur.com/ghovYLm.png - 这是最终结果。
我觉得有趣的是,覆盖在图像不透明部分上的水印的任何部分都可以正常工作。只是它的其余部分有黑色背景。
这让我相信我已经很接近了,我希望你们这些优秀人士的专业知识可以引导我找到解决方案。
非常感谢您的阅读。
【问题讨论】:
-
只是一个注释。 ImageMagick 已经取代了 GD 函数。
-
当然有。不幸的是,我的应用程序故意有非常低的最低要求。诚然,考虑到此功能是唯一存在部分问题的功能,我一直在考虑将该功能设为 ImageMagick 独有,但是......您曾经遇到过其中一个您必须深入了解的问题,即使它会在这个过程中杀死你吗? :-)
-
imagecopymerge - 在这个函数中,最后一个值为 80。这与 alhpa 通道有关,我猜这是问题所在,所以也许可以尝试更改这个值。
-
这是应用于基础图像的水印的不透明度。 i.imgur.com/lWsgc0X.png - 不透明度为 0。i.imgur.com/DxvKmOX.png - 不透明度为 100。
-
是否有可以删除的与可以删除的水印相关的行?尝试缩小问题范围?抱歉,我不知道 GD。