PHP,imagecreate,imagecreatetruecolor,imagecopy,imagecopymerge

时间:2014-03-27 08:42:37

标签: php gd

(1)imagecreate

(2)imagecreatetruecolor

(3)imagecopy

(4)imagecopymerge

我使用上面的PHP函数并感到困惑。

首先我准备两个png文件......

1.png http://www.capbite.com/subfolder/lion/test/1.png

具有透明背景和黑点的QR码,我是通过这些代码创建的(只有关键点,而不是全部)。

$image = imagecreate($width, $height);
imagesavealpha($image, true);
$color1 = imagecolorallocatealpha($image, 0, 0, 0, 127);
imageColorallocate($image, 0, 0, 0);
imagefill($image, 0, 0, $color1);
...
imagepng($image, $filename);

2.png http://www.capbite.com/subfolder/lion/test/2.png

我制作一个png并使用一种颜色来填充MS画颜色。

准备完成。然后代码是

<?php
//use imagecreate or imagecreatetruecolor
$image = imagecreate(50, 50);
//$image = imagecreatetruecolor(50, 50);

//save the alpha channel
imagesavealpha($image, true);

//alphablending set false, then transparent color can cover the canvas
imagealphablending($image, false);

//take a transparent color and fill it
imagefill($image, 0, 0, imagecolorallocatealpha($image, 0, 0, 0, 127));

//draw the ellipse
imagefilledellipse($image, 15, 15, 30, 30, imagecolorallocate($image, 255, 0, 0));

imagepng($image, '3.png');

imagedestroy($image);

//merge image
$im_background = imagecreatefrompng('1.png');
$im_foreground = imagecreatefrompng('3.png');

list($width, $height) = getimagesize('3.png');

//use imagecopy or imagecopymerge
imagecopy($im_background, $im_foreground, (int)35, (int)35, 0, 0, $width, $height);
//imagecopymerge($im_background, $im_foreground, (int)35, (int)35, 0, 0, $width, $height, 100);

imagepng($im_background, 'x-x.png');

imagedestroy($im_background);
imagedestroy($im_foreground);

代码制作3.png像这样www.capbite.com/subfolder/lion/test/3.png

现在如果我使用

1.png + imagecreate + imagecopy将获得http://www.capbite.com/subfolder/lion/test/4-1.png

1.png + imagecreate + imagecopymerge将获得http://www.capbite.com/subfolder/lion/test/4-2.png

1.png + imagecreatetruecolor + imagecopy将获得http://www.capbite.com/subfolder/lion/test/4-3.png

1.png + imagecreatetruecolor + imagecopymerge将获得http://www.capbite.com/subfolder/lion/test/4-4.png

2.png + imagecreate + imagecopy将获得http://www.capbite.com/subfolder/lion/test/5-1.png

2.png + imagecreate + imagecopymerge将获得http://www.capbite.com/subfolder/lion/test/5-2.png

2.png + imagecreatetruecolor + imagecopy将获得http://www.capbite.com/subfolder/lion/test/5-3.png

2.png + imagecreatetruecolor + imagecopymerge将获得http://www.capbite.com/subfolder/lion/test/5-4.png

很难描述通过不同方式制作的图像,因此我粘贴了关于图像的链接,但我的声誉不足以发布更多链接或图像... - 由Niet编辑;)

我的问题是,只是3.png,它有一个透明的背景,甚至使用不同的创建功能,但是当它复制到我创建的另一个图像或MS画面时,结果是我见面。

imagecreate和amp;之间有什么不同? imagecreatetruecolor make 4-1.png和4-3.png?

imagecopy和amp;之间有什么不同? imagecopymerge(甚至pct设置为100)make 4-3.png和4-4.png?

我创建的图像或MS绘制的图像有什么不同4-3.png和5-3.png?

非常感谢!

1 个答案:

答案 0 :(得分:2)

我建议使用imagecreate,而不是imagecreatetruecolor

使用imagecreate时,您定义的第一种颜色将是填充整个画布的背景颜色。这通常是你的“透明”颜色,但通常更好(阅读:在文件中更有效)这样做:

imagecolortransparent($img, imagecolorallocate($img, 255, 0, 255));

通过这种方式,你没有使用alpha通道,你只是告诉它“我用粉红色绘制的任何东西都是透明的” - 顺便说一句,这就是GIF图像中透明度的工作方式,而且它也是这种做法的“传统”方式可以追溯到许多年前的旧游戏!

使用imagecreate生成的图像,复制可以更轻松地处理批次,因为GD确切地知道什么颜色是“透明的”,因此不应该复制到目标上。使用imagecreatetruecolor时,您会进入复杂而混乱的合成业务......

我希望这会帮助你。 GD可以成为一个棘手的野兽,但是一旦你了解了基础知识,你就应该好好去。