PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
本文实例讲述了PHP实现将几张照片拼接到一起的合成图片功能。分享给大家供大家参考,具体如下:
array(位置=>array(x,y,width,height))
$g_models=array(
1=>array(//单页总张数
0=>array(//位置
'x'=>0+$g_border,
'y'=>0+$g_border,
'w'=>$g_width-2*$g_border,
'h'=>$g_height-2*$g_border,
),
),
3=>array(
0=>array(
'x'=>0+$g_border,
'y'=>0+$g_border,
'w'=>$g_width-2*$g_border,
'h'=>($g_height-3*$g_border)/2,
),
1=>array(
'x'=>0+$g_border,
'y'=>0+$g_border+($g_height-3*$g_border)/2+$g_border,
'w'=>($g_width-3*$g_border)/2,
'h'=>($g_height-3*$g_border)/2,
),
2=>array(
'x'=>0+$g_border+($g_width-3*$g_border)/2+$g_border,
'y'=>0+$g_border+($g_height-3*$g_border)/2+$g_border,
'w'=>($g_width-3*$g_border)/2,
'h'=>($g_height-3*$g_border)/2,
),
),
4=>array(
0=>array(
'x'=>0+$g_border,
'y'=>0+$g_border,
'w'=>($g_width-3*$g_border)/2,
'h'=>($g_height-3*$g_border)/2,
),
1=>array(
'x'=>0+$g_border+($g_width-3*$g_border)/2+$g_border,
'y'=>0+$g_border,
'w'=>($g_width-3*$g_border)/2,
'h'=>($g_height-3*$g_border)/2,
),
2=>array(
'x'=>0+$g_border,
'y'=>0+$g_border+($g_height-3*$g_border)/2+$g_border,
'w'=>($g_width-3*$g_border)/2,
'h'=>($g_height-3*$g_border)/2,
),
3=>array(
'x'=>0+$g_border+($g_width-3*$g_border)/2+$g_border,
'y'=>0+$g_border+($g_height-3*$g_border)/2+$g_border,
'w'=>($g_width-3*$g_border)/2,
'h'=>($g_height-3*$g_border)/2,
),
),
);
//排版
$g_tasks=array(
0=>array(0),//封面封底
1=>array(1),
2=>array(2),
3=>array(3),
4=>array(4,5,6),
5=>array(7),
6=>array(8),
7=>array(9,10,11),
8=>array(12),
9=>array(13),
10=>array(14,15,16),
11=>array(17),
12=>array(18),
13=>array(19,20,21),
14=>array(22),
15=>array(23),
16=>array(24,25,26),
17=>array(27,28,29),
18=>array(30),
19=>array(31),
20=>array(32,33,34),
21=>array(35),
22=>array(36),
23=>array(37),
24=>array(38,39,40,41),
25=>array(42,43,44),
26=>array(45),
27=>array(46),
28=>array(47,48,49),
29=>array(50),
30=>array(51),
);
//获取文件夹下的所有图片名
$jpgs=array();
$files=scandir($src_path);//目录下所有文件名
foreach($filesas$file){
$path_parts=pathinfo($src_path.'/'.$file);
if($path_parts['extension']=='jpg'){
$jpgs[]=$src_path.'/'.$file;
}
}
//判断图片总数
if(count($jpgs)!=52){
echo'图片总数有误:'.count($jpgs).'/52'.nl2br("\n");
die();
}
//自然排序
usort($jpgs,"strnatcmp");
foreach($g_tasksas$page=>$photos){
$files=array();
foreach($photosas$r){
$files[]=$jpgs[$r];
}
$image_all=imagemake($files);
$filename=$page.'.jpg';
imagejpeg($image_all,$dst_path.'/'.$filename);
unset($files);
echo$filename.nl2br("\n");
}
echo'ok'.nl2br("\n");
die();
/**
*合成图片
*@paramarray$images本页图片集合
*@returnresource合成后的图片
*/
functionimagemake($files=array()){
global$g_width,$g_height,$g_models;
//合成后的图片
$image_all=imageCreatetruecolor($g_width,$g_height);
//为真彩色画布创建白色背景
$color=imagecolorallocate($image_all,255,255,255);
imagefill($image_all,0,0,$color);
//imageColorTransparent($image_all,$color);//背景透明
//functionimagecopyresampled($dst_image,$src_image,$dst_x,$dst_y,$src_x,$src_y,$dst_w,$dst_h,$src_w,$src_h)
//排版合成
$type=count($files);
switch($type){
case2:
break;
case1:
case3:
case4:
//用于合成的图片集
$images=array();
//修正图片
for($i=0;$i<$type;$i++){
$images[]=imagecropper($files[$i],$g_models[$type][$i]['w'],$g_models[$type][$i]['h']);
}
//排版合成
for($i=0;$i<$type;$i++){
imagecopyresampled($image_all,$images[$i],
$g_models[$type][$i]['x'],$g_models[$type][$i]['y'],0,0,
$g_models[$type][$i]['w'],$g_models[$type][$i]['h'],imagesx($images[$i]),imagesy($images[$i]));
}
break;
default:
break;
}
return$image_all;
}
/**
*修剪图片:居中裁剪等比缩放
*@param$source_path原图路径
*@param$target_width目标宽度
*@param$target_height目标高度
*@returnbool|resource
*/
functionimagecropper($source_path,$target_width,$target_height){
$source_info=getimagesize($source_path);
$source_width=$source_info[0];
$source_height=$source_info[1];
$source_mime=$source_info['mime'];
$source_ratio=$source_height/$source_width;
$target_ratio=$target_height/$target_width;
switch($source_mime)
{
case'image/gif':
$source_image=imagecreatefromgif($source_path);
break;
case'image/jpeg':
$source_image=imagecreatefromjpeg($source_path);
break;
case'image/png':
$source_image=imagecreatefrompng($source_path);
break;
default:
returnfalse;
break;
}
//横竖构图不同,旋转
if(($target_width-$target_height)*($source_width-$source_height)<0){
//旋转
$source_image=imagerotate($source_image,90,0);
$source_width=$source_info[1];//[0]
$source_height=$source_info[0];//[1]
$source_ratio=$source_height/$source_width;
}
//源图过高
if($source_ratio>$target_ratio)
{
$cropped_width=$source_width;
$cropped_height=$source_width*$target_ratio;
$source_x=0;
$source_y=($source_height-$cropped_height)/2;
}
//源图过宽
elseif($source_ratio<$target_ratio)
{
$cropped_width=$source_height/$target_ratio;
$cropped_height=$source_height;
$source_x=($source_width-$cropped_width)/2;
$source_y=0;
}
//源图适中
else
{
$cropped_width=$source_width;
$cropped_height=$source_height;
$source_x=0;
$source_y=0;
}
$target_image=imagecreatetruecolor($target_width,$target_height);
$cropped_image=imagecreatetruecolor($cropped_width,$cropped_height);
//裁剪
imagecopy($cropped_image,$source_image,0,0,$source_x,$source_y,$cropped_width,$cropped_height);
//缩放
imagecopyresampled($target_image,$cropped_image,0,0,0,0,$target_width,$target_height,$cropped_width,$cropped_height);
return$target_image;
}
PS:该代码应用于命令行模式,且需要注意图片文件夹路径。
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP图形与图片操作技巧汇总》、《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》及《PHP数学运算技巧总结》
希望本文所述对大家PHP程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。