0

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

Imagemagick 可以轻松做到这一点。这可能在 php gd 中吗?

4

3 回答 3

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);

所以第一个图像创建了一个透明图像(白色),中间有一个红色方块。第二张图片只是一个蓝色填充。将两者合并,蓝色通过第一张图片的透明部分显示出来,所以我们的红色方块现在位于蓝色填充上。实际上,我们已经填充了透明部分。

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

           
于 2012-07-14T10:44:31.867 回答
0

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

看一下 php gds 函数‘ imagecolortransparent ’:

于 2012-07-14T10:30:30.493 回答
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);
于 2017-04-25T02:39:13.167 回答