English 中文(简体)
PHP和GD-透明背景用附近的颜色填充
原标题:PHP & GD - transparent background being filled with nearby color

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

首先,解释:

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

以下是两张图片:

现在转到我的代码:

我正在使用一个库/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);
?>

我希望输出如下:

但我得到的却是:

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

在上面链接的Combine Class I中,我也尝试过imagecopyimagecopyreseampled和香草imagecopymerge,两者的结果相似。

我完全不知所措。

Edit:

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

Update:

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

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

我觉得这可能很容易错过。

最佳回答

请注意,在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;
            }

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

问题回答

暂无回答




相关问题
Brute-force/DoS prevention in PHP [closed]

I am trying to write a script to prevent brute-force login attempts in a website I m building. The logic goes something like this: User sends login information. Check if username and password is ...

please can anyone check this while loop and if condition

<?php $con=mysql_connect("localhost","mts","mts"); if(!con) { die( unable to connect . mysql_error()); } mysql_select_db("mts",$con); /* date_default_timezone_set ("Asia/Calcutta"); $date = ...

定值美元

如何确认来自正确来源的数字。

Generating a drop down list of timezones with PHP

Most sites need some way to show the dates on the site in the users preferred timezone. Below are two lists that I found and then one method using the built in PHP DateTime class in PHP 5. I need ...

Text as watermarking in PHP

I want to create text as a watermark for an image. the water mark should have the following properties front: Impact color: white opacity: 31% Font style: regular, bold Bevel and Emboss size: 30 ...

How does php cast boolean variables?

How does php cast boolean variables? I was trying to save a boolean value to an array: $result["Users"]["is_login"] = true; but when I use debug the is_login value is blank. and when I do ...