6

我正在尝试使用 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

在此处输入图像描述

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

在此处输入图像描述

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

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

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

4

2 回答 2

9

在将原件复制到 $image 之前,您能否尝试在 $image 上启用 alpha 混合:

imagealphablending($image, true); 

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

$transparent = imagecolorallocatealpha($image, 0, 0, 0, 127);
imagefill($image, 0, 0, $transparent);
imagealphablending($image, true); 
于 2012-07-23T21:19:48.330 回答
3

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

Fabio Anselmo 的评论将有助于 GIF 没有真正的 Alpha 通道——GIF 透明度是全有或全无的——因此保存为一个将完成 100% 或 0% 的解决方案。除非你非常小心,否则它还会在源图像中为你提供一个“边框”——由你在 GIF 转换中选择的任何背景颜色组成——这是图像抗锯齿的结果。(但是,隔行扫描部分无关紧要。)

于 2012-07-23T21:08:12.583 回答