用背景颜色填充 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图片颜色,背景仍需透明,详细,徐步骤,谢谢!

css在灰色透明的背景下,如何才能使上面的字的颜色为白色?

UIView背景颜色和顶部透明png

iPhone - UIView 的背景颜色 - 使用具有透明度的 png?

c#winform怎么把控件背景设为半透明,像这样

拖动png图像时是否可以删除背景颜色?