有一个有透明区域的图像。 (png图片) 现在,在进行图像复制时,我们可以填充那个透明区域吗?
Imagemagick可以轻松完成此操作。这可能在php gd吗?
答案 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);