用背景色填充png透明度
Fill png transparency with background color
我正在重构我大约 5 年前写的一个旧图像 crop/resize 库,但我一直在尝试恢复其中的一个功能。有趣的是,我什至不确定它当时是否有效,因为我可能从未真正使用过它。
我需要能够在保持透明度的同时处理 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 的解决方案,使其在不更改我的其他设置的情况下工作。
像这样的东西应该有用。
<?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);
我正在重构我大约 5 年前写的一个旧图像 crop/resize 库,但我一直在尝试恢复其中的一个功能。有趣的是,我什至不确定它当时是否有效,因为我可能从未真正使用过它。
我需要能够在保持透明度的同时处理 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 的解决方案,使其在不更改我的其他设置的情况下工作。
像这样的东西应该有用。
<?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);