今天介绍一下php里一个实用的功能,就是一张图片与图片和文字的拼接,最近一个做物品鉴定的客户,要求用户上传图片,然后根据图片鉴定物品是正品或是仿冒的,然后返回给用户一个鉴定证书,证书的图片除了用户上传的前两张图片,姓名,订单编号,检测日期外,其他的都信息都是一样的,如下图所示:
由于以上信息是可以通过后台的数据获得的,所以客户要求能自动生成证书,这样能省下不少的时间。
先讲图片拼接,原理就是让一张小图粘贴到大图里,代码如下:
function opentow($dst_path,$thumb_src,$thumb_src2,$order_id){
//$dst_path 原始大图 $thumb_src要拼接的小图1,$thumb_src2 是拼接的小图2,$order_id订单号,用于生成图片名称
$Absolute_Path=substr($_SERVER['SCRIPT_FILENAME'],0,-10);
//本地的绝对路径
$src_path= $thumb_src; //要合并的图片1
$src_path2= $thumb_src2; //要合并的图片2
$hz = substr(strrchr($dst_path, '.'), 1);
$path = 'Uploads/baogao/';
//生成新图片名
$image = $path.$order_id.".".$hz;
//创建图片的实例
$dst = imagecreatefromstring(file_get_contents($dst_path));
$src = imagecreatefromstring(file_get_contents($src_path));
//获取水印图片的宽高
// $src_w =120;$src_h=80;
list($src_w,$src_h) = getimagesize($src_path);
$widthz = 225;//要合并的图片1在原始图片的x位置
$heightz = 628;//要合并的图片1在原始图片的y位置
//如果水印图片本身带透明色,则使用imagecopy方法
imagecopy($dst, $src, $widthz,$heightz, 0, 0, $src_w, $src_h);
$src2 = imagecreatefromstring(file_get_contents($src_path2));
//获取水印图片的宽高
// $src_w =120;$src_h=80;
list($src_w2,$src_h2) = getimagesize($src_path2);
$widthz = 568;//要合并的图片2在原始图片的x位置
$heightz = 628;//要合并的图片2在原始图片的y位置
imagecopy($dst, $src2, $widthz,$heightz, 0, 0, $src_w2, $src_h2);
//输出图片
list($src_w, $src_h, $dst_type) = getimagesize($dst_path);
list($src_w2, $src_h2, $dst_type) = getimagesize($dst_path);
switch ($dst_type) {
case 1://GIF
imagegif($dst, $image);
break;
case 2://JPG
imagejpeg($dst, $image);
break;
case 3://PNG
// header('Content-Type: image/png');
imagepng($dst, $image);
break;
default:
break;
}
return $image;//返回合并后的图片的路径
}
然后是文字拼接,用上面返回的图片路径继续操作
$image_url = $this->opentow($bg_src,$thumb_src,$thumb_src2,$order_id);
$img = $image_url;
ini_set("gd.jpeg_ignore_warning", 1);
$size = 20;//字体大小,可调整大小
$font = "./Uploads/simfang.ttf";//这里加载字体ttf,这里是必须的,否则无法添加文字
$img = imagecreatefromjpeg($img);// 加载已有图像
$black = imagecolorallocate($img, 0, 0, 0);//设置颜色为蓝色
imagettftext($img, $size, 0, 360, 880, $black, $font, $brand_name);//根据坐标添加文字,可根据实际情况随时调用位置,下面同理
imagettftext($img, $size, 0, 355, 935, $black, $font, $cate_name);//添加品牌类别名称
imagettftext($img, $size, 0, 750, 935, $black, $font, stringtime($model['create_time'],2));//添加检测时间
$realname = $member['nickname']?$member['nickname']:'暂未';
imagettftext($img, $size, 0, 360, 990, $black, $font, $realname);//添加姓名
imagettftext($img, $size, 0, 360, 1045, $black, $font, $model['jian_no']);//添加订单号
imagejpeg($img,$image_url);//保存图片
header("location:".."/".$image_url);//这里是指保存后直接在浏览器是显示这张生成的证书图片,如下图所示:
结束语:要注意图片的路径,用的是相对路径,例如图片在Uploads/moban1.jpg里,则图片路径是“./Uploads/moban1.jpg”,也可以用“Uploads/moban1.jpg”,还上面的两张小图片保存的路径是绝对路径,是需要处理成相对路径,由于用户上传的图片大小是不一样大小的,所以需要将这两张图片生成固定宽度和高度的图片进行保存,然后再使用保存后的图片,所以每生成一次证书都会保存两张小图片和一张证书图片,分开放在不同的目录里。
由于以上信息是可以通过后台的数据获得的,所以客户要求能自动生成证书,这样能省下不少的时间。
先讲图片拼接,原理就是让一张小图粘贴到大图里,代码如下:
function opentow($dst_path,$thumb_src,$thumb_src2,$order_id){
//$dst_path 原始大图 $thumb_src要拼接的小图1,$thumb_src2 是拼接的小图2,$order_id订单号,用于生成图片名称
$Absolute_Path=substr($_SERVER['SCRIPT_FILENAME'],0,-10);
//本地的绝对路径
$src_path= $thumb_src; //要合并的图片1
$src_path2= $thumb_src2; //要合并的图片2
$hz = substr(strrchr($dst_path, '.'), 1);
$path = 'Uploads/baogao/';
//生成新图片名
$image = $path.$order_id.".".$hz;
//创建图片的实例
$dst = imagecreatefromstring(file_get_contents($dst_path));
$src = imagecreatefromstring(file_get_contents($src_path));
//获取水印图片的宽高
// $src_w =120;$src_h=80;
list($src_w,$src_h) = getimagesize($src_path);
$widthz = 225;//要合并的图片1在原始图片的x位置
$heightz = 628;//要合并的图片1在原始图片的y位置
//如果水印图片本身带透明色,则使用imagecopy方法
imagecopy($dst, $src, $widthz,$heightz, 0, 0, $src_w, $src_h);
$src2 = imagecreatefromstring(file_get_contents($src_path2));
//获取水印图片的宽高
// $src_w =120;$src_h=80;
list($src_w2,$src_h2) = getimagesize($src_path2);
$widthz = 568;//要合并的图片2在原始图片的x位置
$heightz = 628;//要合并的图片2在原始图片的y位置
imagecopy($dst, $src2, $widthz,$heightz, 0, 0, $src_w2, $src_h2);
//输出图片
list($src_w, $src_h, $dst_type) = getimagesize($dst_path);
list($src_w2, $src_h2, $dst_type) = getimagesize($dst_path);
switch ($dst_type) {
case 1://GIF
imagegif($dst, $image);
break;
case 2://JPG
imagejpeg($dst, $image);
break;
case 3://PNG
// header('Content-Type: image/png');
imagepng($dst, $image);
break;
default:
break;
}
return $image;//返回合并后的图片的路径
}
然后是文字拼接,用上面返回的图片路径继续操作
$image_url = $this->opentow($bg_src,$thumb_src,$thumb_src2,$order_id);
$img = $image_url;
ini_set("gd.jpeg_ignore_warning", 1);
$size = 20;//字体大小,可调整大小
$font = "./Uploads/simfang.ttf";//这里加载字体ttf,这里是必须的,否则无法添加文字
$img = imagecreatefromjpeg($img);// 加载已有图像
$black = imagecolorallocate($img, 0, 0, 0);//设置颜色为蓝色
imagettftext($img, $size, 0, 360, 880, $black, $font, $brand_name);//根据坐标添加文字,可根据实际情况随时调用位置,下面同理
imagettftext($img, $size, 0, 355, 935, $black, $font, $cate_name);//添加品牌类别名称
imagettftext($img, $size, 0, 750, 935, $black, $font, stringtime($model['create_time'],2));//添加检测时间
$realname = $member['nickname']?$member['nickname']:'暂未';
imagettftext($img, $size, 0, 360, 990, $black, $font, $realname);//添加姓名
imagettftext($img, $size, 0, 360, 1045, $black, $font, $model['jian_no']);//添加订单号
imagejpeg($img,$image_url);//保存图片
header("location:".."/".$image_url);//这里是指保存后直接在浏览器是显示这张生成的证书图片,如下图所示:
结束语:要注意图片的路径,用的是相对路径,例如图片在Uploads/moban1.jpg里,则图片路径是“./Uploads/moban1.jpg”,也可以用“Uploads/moban1.jpg”,还上面的两张小图片保存的路径是绝对路径,是需要处理成相对路径,由于用户上传的图片大小是不一样大小的,所以需要将这两张图片生成固定宽度和高度的图片进行保存,然后再使用保存后的图片,所以每生成一次证书都会保存两张小图片和一张证书图片,分开放在不同的目录里。