PHP& GD - 透明背景充满附近的颜色

时间:2011-06-03 15:47:45

标签: php image-processing transparency gd

我知道PHP + GD透明度问题已经在这个和许多其他网站上被打死,但我已经遵循了所有的建议,我似乎无法解决我的问题。

首先,解释:

我正在尝试将一个图像叠加在另一个图像的顶部。他们都有透明的区域。作为我认识的演示应该看起来特别的方式,我试图在我创建的蓝色箭头形状上叠加一个复选标记。

以下是两张图片:

check mark

blue arrow

现在我的代码:

我正在使用我构建的库/ API来避免使用PHP + GD编辑图像时的痛苦。它还处于初期阶段,但相关文件是:

The Base Class
The Main Loader
The (poorly named) Combine Class

我正在使用以下脚本运行代码:

<?php
    require_once('Image.php');

    header("Content-Type: image/png");

    $img = new Image();
    $over = new Image();

    $img->source = "arrow.png";
    $over->source = "chk-done_24.png";

    $img->Combine->Overlay($over, 20, 20, 0, 0, $over->width, $over->height);
    $img->output();
    $img->clean();
    unset($img);
?>

我希望输出是这样的:

Combined images

但我得到了这个:

Square bottom

我完全理解问题如果填充区域是白色或黑色,但填充蓝色对我来说没有任何意义。

在上面链接的组合课程中,我也尝试了imagecopyimagecopyresampled和香草imagecopymerge,两者都有类似的结果。

我完全失去了。

编辑:

要清楚,我的问题是:我的代码的哪一部分不正确?为什么用透明区域(而不是黑色或白色)填充透明区域?如何在保持透明合并图像的同时修复它?

更新

请注意,创建新的Image对象时,会调用newImage,其中包含以下代码:

$this->handle = imagecreatetruecolor($this->width, $this->height);
imagealphablending($this->handle, false);
imagesavealpha($this->handle, true);

我觉得这很容易错过。

1 个答案:

答案 0 :(得分:2)

请注意,您在newImage中创建句柄并在其上调用imagealphablendingimagesavealpha并不重要,因为loadImage会抛弃该句柄。

它用蓝色“填充”透明区域的原因是它没有任何东西填充透明区域。它只是完全丢弃了alpha通道,而蓝色则恰好存储在那些alpha为零的像素中。请注意,在图形程序中可能很难看到,因为该程序本身可以用黑色或白色替换完全透明的像素。

至于您的代码有什么问题,我无法肯定地说,因为我在尝试现有代码时没有得到与您报告的结果相同的结果。但是,如果我将loadImage更改为类似的内容,以便源图像被强制为真彩色,那么它对我有用:

            private function loadImage()
            {
                    $img = null;
                    switch( $this->type )
                    {
                            case 1:
                                            $img = imagecreatefromgif($this->source);
                                            break;
                            case 2:
                                            $img = imagecreatefromjpeg($this->source);
                                            break;
                            case 3:
                                            $img = imagecreatefrompng($this->source);
                                            break;
                            default:
                                            break;
                    }
                    if (!$img) return false;
                    $this->handle = imagecreatetruecolor($this->width, $this->height);
                    imagealphablending($this->handle, false);
                    imagesavealpha($this->handle, true);
                    imagecopyresampled($this->handle, $img, 0, 0, 0, 0, $this->width, $this->height, $this->width, $this->height);
                    return true;
            }

(就个人而言,我比GD更喜欢ImageMagick。)