今天介紹一下php里一個(gè)實(shí)用的功能,就是一張圖片與圖片和文字的拼接,最近一個(gè)做物品鑒定的客戶,要求用戶上傳圖片,然后根據(jù)圖片鑒定物品是正品或是仿冒的,然后返回給用戶一個(gè)鑒定證書,證書的圖片除了用戶上傳的前兩張圖片,姓名,訂單編號(hào),檢測日期外,其他的都信息都是一樣的,如下圖所示:

由于以上信息是可以通過后臺(tái)的數(shù)據(jù)獲得的,所以客戶要求能自動(dòng)生成證書,這樣能省下不少的時(shí)間。
先講圖片拼接,原理就是讓一張小圖粘貼到大圖里,代碼如下:
function opentow($dst_path,$thumb_src,$thumb_src2,$order_id){
//$dst_path 原始大圖 $thumb_src要拼接的小圖1,$thumb_src2 是拼接的小圖2,$order_id訂單號(hào),用于生成圖片名稱
$Absolute_Path=substr($_SERVER['SCRIPT_FILENAME'],0,-10);
//本地的絕對(duì)路徑
$src_path= $thumb_src; //要合并的圖片1
$src_path2= $thumb_src2; //要合并的圖片2
$hz = substr(strrchr($dst_path, '.'), 1);
$path = 'Uploads/baogao/';
//生成新圖片名
$image = $path.$order_id.".".$hz;
//創(chuàng)建圖片的實(shí)例
$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;//返回合并后的圖片的路徑
}
然后是文字拼接,用上面返回的圖片路徑繼續(xù)操作
$image_url = $this->opentow($bg_src,$thumb_src,$thumb_src2,$order_id);
$img = $image_url;
ini_set("gd.jpeg_ignore_warning", 1);
$size = 20;//字體大小,可調(diào)整大小
$font = "./Uploads/simfang.ttf";//這里加載字體ttf,這里是必須的,否則無法添加文字
$img = imagecreatefromjpeg($img);// 加載已有圖像
$black = imagecolorallocate($img, 0, 0, 0);//設(shè)置顏色為藍(lán)色
imagettftext($img, $size, 0, 360, 880, $black, $font, $brand_name);//根據(jù)坐標(biāo)添加文字,可根據(jù)實(shí)際情況隨時(shí)調(diào)用位置,下面同理
imagettftext($img, $size, 0, 355, 935, $black, $font, $cate_name);//添加品牌類別名稱
imagettftext($img, $size, 0, 750, 935, $black, $font, stringtime($model['create_time'],2));//添加檢測時(shí)間
$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']);//添加訂單號(hào)
imagejpeg($img,$image_url);//保存圖片
header("location:".."/".$image_url);//這里是指保存后直接在瀏覽器是顯示這張生成的證書圖片,如下圖所示:

結(jié)束語:要注意圖片的路徑,用的是相對(duì)路徑,例如圖片在Uploads/moban1.jpg里,則圖片路徑是“./Uploads/moban1.jpg”,也可以用“Uploads/moban1.jpg”,還上面的兩張小圖片保存的路徑是絕對(duì)路徑,是需要處理成相對(duì)路徑,由于用戶上傳的圖片大小是不一樣大小的,所以需要將這兩張圖片生成固定寬度和高度的圖片進(jìn)行保存,然后再使用保存后的圖片,所以每生成一次證書都會(huì)保存兩張小圖片和一張證書圖片,分開放在不同的目錄里。

由于以上信息是可以通過后臺(tái)的數(shù)據(jù)獲得的,所以客戶要求能自動(dòng)生成證書,這樣能省下不少的時(shí)間。
先講圖片拼接,原理就是讓一張小圖粘貼到大圖里,代碼如下:
function opentow($dst_path,$thumb_src,$thumb_src2,$order_id){
//$dst_path 原始大圖 $thumb_src要拼接的小圖1,$thumb_src2 是拼接的小圖2,$order_id訂單號(hào),用于生成圖片名稱
$Absolute_Path=substr($_SERVER['SCRIPT_FILENAME'],0,-10);
//本地的絕對(duì)路徑
$src_path= $thumb_src; //要合并的圖片1
$src_path2= $thumb_src2; //要合并的圖片2
$hz = substr(strrchr($dst_path, '.'), 1);
$path = 'Uploads/baogao/';
//生成新圖片名
$image = $path.$order_id.".".$hz;
//創(chuàng)建圖片的實(shí)例
$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;//返回合并后的圖片的路徑
}
然后是文字拼接,用上面返回的圖片路徑繼續(xù)操作
$image_url = $this->opentow($bg_src,$thumb_src,$thumb_src2,$order_id);
$img = $image_url;
ini_set("gd.jpeg_ignore_warning", 1);
$size = 20;//字體大小,可調(diào)整大小
$font = "./Uploads/simfang.ttf";//這里加載字體ttf,這里是必須的,否則無法添加文字
$img = imagecreatefromjpeg($img);// 加載已有圖像
$black = imagecolorallocate($img, 0, 0, 0);//設(shè)置顏色為藍(lán)色
imagettftext($img, $size, 0, 360, 880, $black, $font, $brand_name);//根據(jù)坐標(biāo)添加文字,可根據(jù)實(shí)際情況隨時(shí)調(diào)用位置,下面同理
imagettftext($img, $size, 0, 355, 935, $black, $font, $cate_name);//添加品牌類別名稱
imagettftext($img, $size, 0, 750, 935, $black, $font, stringtime($model['create_time'],2));//添加檢測時(shí)間
$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']);//添加訂單號(hào)
imagejpeg($img,$image_url);//保存圖片
header("location:".."/".$image_url);//這里是指保存后直接在瀏覽器是顯示這張生成的證書圖片,如下圖所示:

結(jié)束語:要注意圖片的路徑,用的是相對(duì)路徑,例如圖片在Uploads/moban1.jpg里,則圖片路徑是“./Uploads/moban1.jpg”,也可以用“Uploads/moban1.jpg”,還上面的兩張小圖片保存的路徑是絕對(duì)路徑,是需要處理成相對(duì)路徑,由于用戶上傳的圖片大小是不一樣大小的,所以需要將這兩張圖片生成固定寬度和高度的圖片進(jìn)行保存,然后再使用保存后的圖片,所以每生成一次證書都會(huì)保存兩張小圖片和一張證書圖片,分開放在不同的目錄里。