我知道PHP + GD透明度问题已经在这个和许多其他网站上被打死,但我已经遵循了所有的建议,我似乎无法解决我的问题。
首先,解释:
我正在尝试将一个图像叠加在另一个图像的顶部。他们都有透明的区域。作为我认识的演示应该看起来特别的方式,我试图在我创建的蓝色箭头形状上叠加一个复选标记。
以下是两张图片:
现在我的代码:
我正在使用我构建的库/ 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);
?>
我希望输出是这样的:
但我得到了这个:
我完全理解问题如果填充区域是白色或黑色,但填充蓝色对我来说没有任何意义。
在上面链接的组合课程中,我也尝试了imagecopy,imagecopyresampled和香草imagecopymerge,两者都有类似的结果。
我完全失去了。
要清楚,我的问题是:我的代码的哪一部分不正确?为什么用透明区域(而不是黑色或白色)填充透明区域?如何在保持透明合并图像的同时修复它?
请注意,创建新的Image对象时,会调用newImage
,其中包含以下代码:
$this->handle = imagecreatetruecolor($this->width, $this->height);
imagealphablending($this->handle, false);
imagesavealpha($this->handle, true);
我觉得这很容易错过。
答案 0 :(得分:2)
请注意,您在newImage
中创建句柄并在其上调用imagealphablending
和imagesavealpha
并不重要,因为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。)