PHP 合并图片,长按图片保存图片到本地
一个小分享,平时 image 相关函数用的比较少,这次刚好用上了,就分享一波。其实这个需求前端做起来会更加的方便,采用:html2canvas 可以实现,不过这一篇主要介绍 PHP 的实现。
场景
场景是这样的,一个小活动,我们提供的一张图片 a.jpg ,然后需要用户上传一张图片 b.jpg ,最终达到用户长按此图可以进行保存。没用进行合并之前,我们采取的的是将 b.jpg 渲染进 a.jpg ,但是这样有一个问题,就是在长按保存的时候只能保存到 a.jpg ,因为也许你的 a.jpg 很大,b.jpg 比较小,且不是一张完整图片,所以最后采用 image 相关函数实现了先合并,后渲染,最后长按保存成功。来个图说明一下:
看这张图就很容易知道我想要表达的东西了。下面我们上代码来实现功能
实现
/** * 合并背景图和用户上传图片并添加时间戳水印 * @param $img_1 a图 * @param $img_2 b图 * @param $dst_x b图向右移动尺寸 * @param $dst_y b图向右移动下寸 * @param $dst_w b图宽度(按比例缩放以后) * @param $dst_h b图高度(按比例缩放以后) * @return string 返回合成后图片名称 */
function composeImg($img_1,$img_2,$dst_x,$dst_y,$dst_w,$dst_h)
{
$img_1 = './a.jpg';
$img_2 = './b.jpg';
$time = date('Y-m-d H:i:s',time());//水印内容,我写的是当前时间,可修改
//注意:imagecreatefromjpeg() 和 imagecreatefrompng()函数
//文件真正的 mime 类型是 png 的类型 需要修改函数
$image_1 = imagecreatefromjpeg($img_1);
$textcolor = imagecolorallocate($image_1, 255, 255, 255); //设置水印字体颜色
$font = __DIR__.'/msyh.ttf'; //定义字体,注意,如果是水印失败,请查看字体是否引入,路径是否正确
imagettftext(
$image_1,
14, //字体大小
0,
30, //水印位置向右
880, //水印位置向下
$textcolor,
$font,//字体
$time//水印内容
);//将文字写到图片中
$image_2 = imagecreatefromjpeg($img_2);
$image_3 = imagecreatetruecolor(imagesx($image_1),imagesy($image_1));
imagecopymerge($image_3,$image_1,0,0,0,0,imagesx($image_1),imagesy($image_1),100);
list($width,$height) = getimagesize($img_2); // 获取 b.jpg 图片的信息
imagecopyresampled(
$image_3,
$image_2,
$dst_x,
$dst_y,
0,
0,
$dst_w,
$dst_h,
$width,
$height
);
$pic_name = md5(uniqid()).".jpg";
imagejpeg($image_3,'./finalImages/'.$pic_name,50);//此处保存图片位置可以自定义,我只是提供例子随便写一个,记得修改
imagedestroy($image_3);
$imgName=$pic_name;
return $imgName;
}
最终,返回的就是合成之后的图片名称,并且带有一个时间水印。
在文章开始部分,我就说过:html2canvas 这种方法实现这个需求,有兴趣的可以看一看。
本文介绍的方法,欢迎交流~~
还没有评论,来说两句吧...