php合成照片

来源:互联网 发布:医疗软件销售 编辑:程序博客网 时间:2024/05/17 05:57

php中合成照片,将几张照片拼接到一起,整体输出方便打印:

<?php/** * 作品合成程序 * 针对单面,封面不做特殊处理 */$src_path = $argv[1];// php该文件,第一个参数是文件夹名(作品集),可相对路径$dst_path = '../image/'.$src_path;// 生成文件存放的目标位置if (!file_exists($dst_path)){mkdir($dst_path);}// 合成图推荐大小,单页大小建议:1120*1600$g_width = 1120;$g_height = 1600;$g_border = 20;// 边框// 模板// 图片张数=>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($files as $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_tasks as $page=>$photos){$files = array();foreach($photos as $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();/** * 合成图片 * @param array $images 本页图片集合 * @return resource 合成后的图片 */function imagemake($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);// 背景透明//function imagecopyresampled ($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){case 2:break;case 1:case 3:case 4:// 用于合成的图片集$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 目标高度 * @return bool|resource */function imagecropper($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:return false;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;}


0 0