用背景颜色填充 png 透明度
Posted
技术标签:
【中文标题】用背景颜色填充 png 透明度【英文标题】:Fill png transparency with background color 【发布时间】:2018-09-21 14:37:24 【问题描述】:我正在重构大约 5 年前编写的旧图像裁剪/调整大小库,但我一直在尝试恢复其中一个功能。有趣的是,我什至不确定它当时是否有效,因为我可能从未真正使用过它。
我需要能够在保持透明度的同时处理 png 图像(这可行),但我也不能用颜色填充图像的透明部分。
创建一个空白图像并用颜色填充它可以正常工作,但是当我尝试将我的 png 粘贴在它上面时,背景又是透明的。
这是我的代码的简化版本:
<?php
$src = imagecreatefrompng($pathToSomePngFile);
imagealphablending($src, false);
imagesavealpha($src, true);
$output = imagecreatetruecolor($width, $height);
if ($backgroundColor)
$fillColor = imagecolorallocate(
$output,
$backgroundColor['r'],
$backgroundColor['g'],
$backgroundColor['b']
);
imagefilledrectangle(
$output,
0,
0,
$width,
$height,
$fillColor
);
else
imagealphablending($output, false);
imagesavealpha($output, true);
imagecopyresampled(
$output,
$src,
0,
0,
0,
0,
$width,
$height,
$width,
$height
);
imagepng($output, $pathToWhereImageIsSaved);
更新
更新了 delboy1978uk 的解决方案,使其在不更改我的其他设置的情况下工作。
【问题讨论】:
我想说,用你想要的背景创建一个新图像,然后复制透明的图像,但我看到有人已经回答了。 是的,这就是我之前所做的,但由于 imagealphablending 和 imagesavealpha 设置,它不起作用。我所做的只是添加了 if 语句。 【参考方案1】:这样的事情应该可以工作。
<?php
// open original image
$img = imagecreatefrompng($originalTransparentImage);
$width = imagesx($img);
$height = imagesy($img);
// make a plain background with the dimensions
$background = imagecreatetruecolor($width, $height);
$color = imagecolorallocate($background, 127, 127, 127); // grey background
imagefill($background, 0, 0, $color);
// place image on top of background
imagecopy($background, $img, 0, 0, 0, 0, $width, $height);
//save as png
imagepng($background, '/path/to/new.png', 0);
【讨论】:
您的代码确实有效,但是我想保留我的设置以获得更好的输出质量,所以我挖掘了更多内容来检查您和我之间的差异。背景资源上的 imagealphablending 和 imagesavealpha 是罪魁祸首(似乎对加载的 png 文件没有影响)。所以我添加了一个条件,只在我不想使用背景颜色时应用这些过滤器等等,现在就像一个魅力一样,谢谢。 很高兴能帮上忙,祝您有美好的一天!以上是关于用背景颜色填充 png 透明度的主要内容,如果未能解决你的问题,请参考以下文章
如何用Photoshop修改PNG图片颜色,背景仍需透明,详细,徐步骤,谢谢!