PHP GD:我可以填充透明部分吗?

时间:2012-07-14 10:24:12

标签: php gd

有一个有透明区域的图像。 (png图片) 现在,在进行图像复制时,我们可以填充那个透明区域吗?

Imagemagick可以轻松完成此操作。这可能在php gd吗?

3 个答案:

答案 0 :(得分:2)

通过imagecopymerge()的分层方法是一条路线。这个概念是将源图像合并到一个新图像上,并带有预先设置的背景图像,一旦合并,它将通过源图像的透明度显示出来。

//create main image - transparent, with opaque red square in middle
$img = imagecreate(60, 60);
$white = imagecolorallocate($img, 255, 255, 255);
imagecolortransparent($img, $white); //make background transparent
$red = imagecolorallocate($img, 255, 0, 0);
imagefilledrectangle($img, imagesx($img) / 4, imagesy($img) / 4, imagesx($img) - (imagesx($img) / 4), imagesy($img) - (imagesy($img) / 4), $red);

//create new image, with pre-filled background, then merge first image across
$img2 = imagecreate(60, 60);
$blue = imagecolorallocate($img2, 0, 0, 255);
imagecopymerge($img2, $img, 0, 0, 0, 0, imagesx($img), imagesy($img), 100);

//output
imagepng($img2);

因此,第一张图像会创建一个透明图像(白色),中间有一个红色正方形。第二个图像只是一个蓝色填充。合并两个,蓝色显示通过第一个图像的透明部分,所以我们的红色方块现在位于蓝色填充。实际上,我们填补了透明部分。

这是按顺序排列的三种状态。

答案 1 :(得分:0)

在有透明度的地方没有什么可以“填补”。 png(或gif)中的透明度不是没有颜色,而是专门标记为透明的单一颜色。因此,您要删除该标记。

看一下php gds函数'imagecolortransparent':

答案 2 :(得分:0)

不,你不能。 相反,您可以尝试从彩色矩形创建副本。这段代码对我有用:

$input = imagecreatefrompng($file_input);
list($width, $height) = getimagesize($file_input);
$output = imagecreatetruecolor($width, $height);
$white = imagecolorallocate($output,  255, 255, 255);
imagefilledrectangle($output, 0, 0, $width, $height, $white);
imagecopy($output, $input, 0, 0, 0, 0, $width, $height);
imagepng($output, $file_output);