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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。