如何合并两个图像并在运行时保存在PHP?

时间:2012-07-04 13:50:15

标签: php gd

我想在帧中上传图片并将图像和帧保存为单个图像,主要的是无论帧中图像的大小如何,它在合并后的最终结果图像中应该看起来完全相同。 这是我的代码的一部分:

$imgframe = $_GET['imgframe'];
$imgphoto = $_GET['imgphoto'];

$imgwidth = $_GET['imgwidth'];
$imgheight = $_GET['imgheight'];

$imgleft = substr($_GET['imgleft'],0,-2);
$imgtop = substr($_GET['imgtop'],0, -2);

$src = imagecreatefromjpeg($imgphoto);//'image.jpg'
$dest = imagecreatefrompng($imgframe);//clip_image002.png

imagealphablending($dest, false);
imagesavealpha($dest, true);

imagecopyresampled( 
     $dest, $src, $imgleft, $imgtop, $imgleft, $imgtop,
     $imgwidth, $imgheight, $imgwidth, $imgheight
);

1 个答案:

答案 0 :(得分:0)

根据您在问题下方的评论,您使用了错误的功能。

imagecopymerge的PHP手册页指出它将图像的一部分复制到另一个图像上。它声明您可以指定要从源复制的区域的原点坐标,宽度和高度,以及放置该区域的目标中的坐标。

换句话说,它从源图像中获取给定大小的矩形区域,并将其放置在给定位置的目标顶部。它不会要求您复制它的区域的大小,只询问位置。因此,它不会调整复制区域的大小,而是按像素逐像素复制。

您实际需要的功能是imagecopyresampled,它允许您指定目标区域的大小,并且可以平滑地缩放源区域以适应。

修改

您仍然遇到问题,因为您在源和目标参数中使用相同的坐标和相同的尺寸。相同尺寸==没有调整大小。

$imgframe = $_GET['imgframe'];
$imgphoto = $_GET['imgphoto'];

// I am assuming these specify the area of the imgphoto which
// should be placed in the frame?
$imgwidth = $_GET['imgwidth'];
$imgheight = $_GET['imgheight'];
$imgleft = substr($_GET['imgleft'],0,-2);
$imgtop = substr($_GET['imgtop'],0, -2);

// now you also need to get the size of the frame so that
// you can resize the photo correctly:
$frameSize = getimagesize($imgframe);

$src = imagecreatefromjpeg($imgphoto);//'image.jpg'
$dest = imagecreatefrompng($imgframe);//clip_image002.png

imagealphablending($dest, false);
imagesavealpha($dest, true);

imagecopyresampled( 
     $dest, $src, 
     0, 0, // these two specify where in the DESTINATION you want to place the source.  You might want these to be offset by the width of the frame
     $imgleft, $imgtop, // the origin of area of the source you want to copy
     $frameSize[0], $frameSize[1], // These specify the size of the area that you want to copy IN TO (i.e., the size in the destination), again you might want to reduce these to take into account the width of the frame
     $imgwidth, $imgheight // the size of the area to copy FROM
);