PHP:将透明 PNG 添加到具有不透明度的 JPEG

Posted

技术标签:

【中文标题】PHP:将透明 PNG 添加到具有不透明度的 JPEG【英文标题】:PHP: Add a Transparent PNG to a JPEG with Opacity 【发布时间】:2012-03-11 15:14:27 【问题描述】:

这似乎是一个常见问题,但尝试了所有组合,我发现它仍然不适合我。

我的 PNG 水印是透明的,我希望用这个水印覆盖原始 JPG,并为水印添加 50% 的不透明度。

添加了水印并创建了不透明度,但 PNG 的透明度呈现为不透明的白色。

我见过使用imagecopy() 的示例,但该函数没有添加不透明度的选项。

我的代码如下:

<?php
$file = 'orgCar.jpg';
$newfile = 'newCar.jpg';

if (!copy($file, $newfile)) 
    echo "failed to copy $file...\n";

$tempIMG = imagecreatefromjpeg($newfile);
$wmkIMG = imagecreatefrompng('wmark.png');
imagealphablending($wmkIMG,true);

imagecopymerge($tempIMG, $wmkIMG, 755, 864, 0, 0, 465, 36, 50);

// Save the image to file and free memory
imagejpeg($tempIMG,'newWM.jpg');
imagedestroy($orgIMG);
imagedestroy($wmkIMG);

echo '<h3>Testing of Watermarking</h3>';
echo '<div>';
echo '<img  src="orgCar.jpg" title="original" alt"" />';
echo '<img  src="newCar.jpg" title="copy" alt"" />';
echo '<img  src="wmark.png" title="watermark" alt"" /><br>';
echo '<img  src="newWM.jpg" title="New with Watermark" alt"" />';
echo '</div>';
?>

如果有一个简单的答案,我忽略了,那么我将非常感激,如果有人能指出我。

【问题讨论】:

this 好用吗? 我尝试了该选项,但它不会为水印创建不透明度。 【参考方案1】:

问题是您传递给imagecopymerge() 的透明度量被使用而不是图像 Alpha 通道,而不是添加到其中。

你有两个选择:

1) 修改 PNG,使其包含 50% 的不透明度,然后使用imagecopy()(我对其进行了测试并且工作正常)。请记住,真彩色 PNG 可以使用完整的 Alpha 通道,因此您可以在图像中包含半透明。

2) 使用此处描述的解决方法:

imagecopymerge_alpha

【讨论】:

我使用 Fireworks 尝试了您的绝妙想法,以减少水印的不透明度。它降低了水印的强度,但是当我做imagecopy() 时,外部的透明度起作用了,但主水印没有任何不透明性。在执行imagecopy() 之前,我是否需要将任何 GD 命令应用于我的水印,或者我是否需要使用不同的程序来创建不透明效果。 对于测试,我使用了您的代码并首先用 imagecopy() 替换了 imagecopymerge(),然后用 imagecopymerge_alpha() 替换(这两种方法产生相同的视觉结果)。也许 Fireworks 将 PNG 保存为 8 位(256 色)?对于完整的 alpha 通道,您需要将图像保存为 32 位,否则 PNG 就像 GIF 图像一样工作。您可以使用 Irfanview 检查图像的 PNG 格式:irfanview.com(图像 -> 信息)。

以上是关于PHP:将透明 PNG 添加到具有不透明度的 JPEG的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中调整具有透明度的 png 大小?

Firefox 可以显示 JP2 图像吗?

将位图 (bmp) 转换为具有透明度的 png (Windows c++)

透明叠加创建PNG

表格中图像背景的透明度[重复]

如何在 Pygame 中将具有一定透明度的 PNG 粘贴到表面上? [复制]