为什么这个透明的PNG在使用GD组合时会导致边界?

时间:2012-07-23 21:02:04

标签: php image transparency gd antialiasing

我正在尝试使用PHP从另一个图像创建图像。这是我的代码:

<?php
    $width = 109;
    $height = 109;
    $image = imagecreatetruecolor($width, $height);
    $source_under = imagecreatefrompng('ecloid_under.png');
    $black = imagecolorallocate($image, 0x00, 0x00, 0x00);

    imagecolortransparent($image, $black);

    imagecopy($image, $source_under, 0, 0, 0, 0, $width, $height);

    header('Content-type: image/png');
    imagepng($image);
    imagedestroy($image);
?>

所以我在$source_under

中加载此图片

enter image description here

并将其复制到透明的空白“画布”图像上。以下是该操作的结果:

enter image description here

可以看出,整个初始图像周围有一种黑色边框。我认为这是因为最初“画布”图像都是黑色的。因此,图像的透明度和抗锯齿有问题。

这不是我第一次遇到类似问题,但上次源图像是原因。这一次,在Photoshop中打开它并没有显示任何潜在的问题。

有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:7)

在将原件复制到$ image之前,您是否可以尝试在$ image上启用Alpha混合:

imagealphablending($image, true); 

第二次尝试是创建一个透明的颜色,并在复制前用该颜色填充$ image。

$transparent = imagecolorallocatealpha($image, 0, 0, 0, 127);
imagefill($image, 0, 0, $transparent);
imagealphablending($image, true); 

答案 1 :(得分:3)

源图像边缘周围有部分透明度。这使得它与画布图像的黑色相结合(您通常无法看到它,因为它是100%透明的),给出您看到的结果。您可以通过确保源图像上的整个Alpha通道为100%或0%,或者为画布图像选择更合适的基色(即与您网站的背景颜色方案匹配的颜色)来避免这种情况。 / p>

Fabio Anselmo的评论将有助于GIF没有真正的alpha通道 - GIF透明度是全有或全无 - 所以节省一个人将完成100%或0%的解决方案。除非你非常小心,它还会在源图像中为你提供一个“边框” - 由你拥有的任何背景颜色或在GIF转换中选择 - 作为图像的抗锯齿效果。 (但是,隔行扫描部分无关紧要。)