当前位置:首页 > PHP教程 > php应用 > 列表

PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】

发布:smiling 来源: PHP粉丝网  添加日期:2021-08-19 10:32:37 浏览: 评论:0 

这篇文章主要介绍了PHP实现将几张照片拼接到一起的合成图片功能,可实现多张图片的合并,便于整体打印输出.涉及php字符串、数组的遍历、排序及图片合成、裁剪、缩放等相关操作技巧,需要的朋友可以参考下。

本文实例讲述了PHP实现将几张照片拼接到一起的合成图片功能,分享给大家供大家参考,具体如下:

  1. <?php 
  2. /** 
  3.  * 作品合成程序 
  4.  * 针对单面,封面不做特殊处理 
  5.  */ 
  6. $src_path = $argv[1]; // php该文件,第一个参数是文件夹名(作品集),可相对路径 
  7. $dst_path = '../image/'.$src_path// 生成文件存放的目标位置 
  8. if (!file_exists($dst_path)){ 
  9.  mkdir($dst_path); 
  10. // 合成图推荐大小,单页大小建议:1120*1600 
  11. $g_width = 1120; 
  12. $g_height = 1600; 
  13. $g_border = 20; // 边框 
  14. // 模板 
  15. // 图片张数=>array(位置=>array(x,y,width,height)) 
  16. $g_models = array
  17.  1=>array// 单页总张数 
  18.   0=>array// 位置 
  19.    'x' => 0 + $g_border
  20.    'y' => 0 + $g_border
  21.    'w' => $g_width - 2*$g_border
  22.    'h' => $g_height - 2*$g_border
  23.   ), 
  24.  ), 
  25.  3=>array
  26.   0=>array
  27.    'x' => 0 + $g_border
  28.    'y' => 0 + $g_border
  29.    'w' => $g_width - 2*$g_border
  30.    'h' => ($g_height - 3*$g_border)/2, 
  31.   ), 
  32.   1=>array
  33.    'x' => 0 + $g_border
  34.    'y' => 0 + $g_border + ($g_height - 3*$g_border)/2 + $g_border
  35.    'w' => ($g_width - 3*$g_border)/2, 
  36.    'h' => ($g_height - 3*$g_border)/2, 
  37.   ), 
  38.   2=>array
  39.    'x' => 0 + $g_border + ($g_width - 3*$g_border)/2 + $g_border
  40.    'y' => 0 + $g_border + ($g_height - 3*$g_border)/2 + $g_border
  41.    'w' => ($g_width - 3*$g_border)/2, 
  42.    'h' => ($g_height - 3*$g_border)/2, 
  43.   ), 
  44.  ), 
  45.  4=>array
  46.   0=>array
  47.    'x' => 0 + $g_border
  48.    'y' => 0 + $g_border
  49.    'w' => ($g_width-3*$g_border)/2, 
  50.    'h' => ($g_height-3*$g_border)/2, 
  51.   ), 
  52.   1=>array
  53.    'x' => 0 + $g_border + ($g_width-3*$g_border)/2 + $g_border
  54.    'y' => 0 + $g_border
  55.    'w' => ($g_width-3*$g_border)/2, 
  56.    'h' => ($g_height-3*$g_border)/2, 
  57.   ), 
  58.   2=>array
  59.    'x' => 0 + $g_border
  60.    'y' => 0 + $g_border + ($g_height-3*$g_border)/2 + $g_border
  61.    'w' => ($g_width-3*$g_border)/2, 
  62.    'h' => ($g_height-3*$g_border)/2, 
  63.   ), 
  64.   3=>array
  65.    'x' => 0 + $g_border + ($g_width-3*$g_border)/2 + $g_border
  66.    'y' => 0 + $g_border + ($g_height-3*$g_border)/2 + $g_border
  67.    'w' => ($g_width-3*$g_border)/2, 
  68.    'h' => ($g_height-3*$g_border)/2, 
  69.   ), 
  70.  ), 
  71. ); 
  72. // 排版 
  73. $g_tasks = array
  74.  0 => array(0), // 封面封底 
  75.  1 => array(1), 
  76.  2 => array(2), 
  77.  3 => array(3), 
  78.  4 => array(4,5,6), 
  79.  5 => array(7), 
  80.  6 => array(8), 
  81.  7 => array(9,10,11), 
  82.  8 => array(12), 
  83.  9 => array(13), 
  84.  10 => array(14,15,16), 
  85.  11 => array(17), 
  86.  12 => array(18), 
  87.  13 => array(19,20,21), 
  88.  14 => array(22), 
  89.  15 => array(23), 
  90.  16 => array(24,25,26), 
  91.  17 => array(27,28,29), 
  92.  18 => array(30), 
  93.  19 => array(31), 
  94.  20 => array(32,33,34), 
  95.  21 => array(35), 
  96.  22 => array(36), 
  97.  23 => array(37), 
  98.  24 => array(38,39,40,41), 
  99.  25 => array(42,43,44), 
  100.  26 => array(45), 
  101.  27 => array(46), 
  102.  28 => array(47,48,49), 
  103.  29 => array(50), 
  104.  30 => array(51), 
  105. ); 
  106. // 获取文件夹下的所有图片名 
  107. $jpgs = array(); 
  108. $files = scandir($src_path); // 目录下所有文件名 
  109. foreach($files as $file){ 
  110.  $path_parts = pathinfo($src_path.'/'.$file); 
  111.  if($path_parts['extension'] == 'jpg'){ 
  112.   $jpgs[] = $src_path.'/'.$file
  113.  } 
  114. // 判断图片总数 
  115. if(count($jpgs) != 52){ 
  116.  echo '图片总数有误:'.count($jpgs).'/52'.nl2br("\n"); 
  117.  die(); 
  118. // 自然排序 
  119. usort($jpgs"strnatcmp"); 
  120. foreach($g_tasks as $page=>$photos){ 
  121.  $files = array(); 
  122.  foreach($photos as $r){ 
  123.   $files[] = $jpgs[$r]; 
  124.  } 
  125.  $image_all = imagemake($files); 
  126.  $filename = $page.'.jpg'
  127.  imagejpeg($image_all$dst_path.'/'.$filename); 
  128.  unset($files); 
  129.  echo $filename.nl2br("\n"); 
  130. echo 'ok'.nl2br("\n"); 
  131. die(); 
  132. /** 
  133.  * 合成图片 
  134.  * @param array $images 本页图片集合 
  135.  * @return resource 合成后的图片 
  136.  */ 
  137. function imagemake($files=array()){ 
  138.  global $g_width,$g_height,$g_models
  139.  // 合成后的图片 
  140.  $image_all = imageCreatetruecolor($g_width,$g_height); 
  141.  // 为真彩色画布创建白色背景 
  142.  $color = imagecolorallocate($image_all, 255, 255, 255); 
  143.  imagefill($image_all, 0, 0, $color); 
  144. // imageColorTransparent($image_all, $color); // 背景透明 
  145.  //function imagecopyresampled ($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h) 
  146.  // 排版合成 
  147.  $type = count($files); 
  148.  switch($type){ 
  149.   case 2: 
  150.    break
  151.   case 1: 
  152.   case 3: 
  153.   case 4: 
  154.    // 用于合成的图片集 
  155.    $images = array(); 
  156.    // 修正图片 
  157.    for($i=0;$i<$type;$i++){ 
  158.     $images[] = imagecropper($files[$i],$g_models[$type][$i]['w'],$g_models[$type][$i]['h']); 
  159.    } 
  160.    // 排版合成 
  161.    for($i=0;$i<$type;$i++){ 
  162.     imagecopyresampled($image_all,$images[$i], 
  163.      $g_models[$type][$i]['x'],$g_models[$type][$i]['y'],0,0, 
  164.      $g_models[$type][$i]['w'],$g_models[$type][$i]['h'],imagesx($images[$i]),imagesy($images[$i])); 
  165.    } 
  166.    break
  167.   default
  168.    break
  169.  } 
  170.  return $image_all
  171. /** 
  172.  * 修剪图片:居中裁剪等比缩放 
  173.  * @param $source_path 原图路径 
  174.  * @param $target_width 目标宽度 
  175.  * @param $target_height 目标高度 
  176.  * @return bool|resource 
  177.  */ 
  178. function imagecropper($source_path$target_width$target_height){ 
  179.  $source_info = getimagesize($source_path); 
  180.  $source_width = $source_info[0]; 
  181.  $source_height = $source_info[1]; 
  182.  $source_mime = $source_info['mime']; 
  183.  $source_ratio = $source_height / $source_width
  184.  $target_ratio = $target_height / $target_width
  185.  switch ($source_mime
  186.  { 
  187.   case 'image/gif'
  188.    $source_image = imagecreatefromgif($source_path); 
  189.    break
  190.   case 'image/jpeg'
  191.    $source_image = imagecreatefromjpeg($source_path); 
  192.    break
  193.   case 'image/png'
  194.    $source_image = imagecreatefrompng($source_path); 
  195.    break
  196.   default
  197.    return false; 
  198.    break
  199.  } 
  200.  // 横竖构图不同,旋转 
  201.  if(($target_width-$target_height)*($source_width-$source_height)<0){ 
  202.   // 旋转 
  203.   $source_image = imagerotate($source_image, 90, 0); 
  204.   $source_width = $source_info[1]; // [0] 
  205.   $source_height = $source_info[0]; // [1] 
  206.   $source_ratio = $source_height / $source_width
  207.  } 
  208.  // 源图过高 
  209.  if ($source_ratio > $target_ratio
  210.  { 
  211.   $cropped_width = $source_width
  212.   $cropped_height = $source_width * $target_ratio
  213.   $source_x = 0; 
  214.   $source_y = ($source_height - $cropped_height) / 2; 
  215.  } 
  216.  // 源图过宽 
  217.  elseif ($source_ratio < $target_ratio
  218.  { 
  219.   $cropped_width = $source_height / $target_ratio
  220.   $cropped_height = $source_height
  221.   $source_x = ($source_width - $cropped_width) / 2; 
  222.   $source_y = 0; 
  223.  } 
  224.  // 源图适中 
  225.  else 
  226.  { 
  227.   $cropped_width = $source_width
  228.   $cropped_height = $source_height
  229.   $source_x = 0; 
  230.   $source_y = 0; 
  231.  } 
  232.  $target_image = imagecreatetruecolor($target_width$target_height); 
  233.  $cropped_image = imagecreatetruecolor($cropped_width$cropped_height); 
  234.  // 裁剪 
  235.  imagecopy($cropped_image$source_image, 0, 0, $source_x$source_y$cropped_width$cropped_height); 
  236.  // 缩放 
  237.  imagecopyresampled($target_image$cropped_image, 0, 0, 0, 0, $target_width$target_height$cropped_width$cropped_height); 
  238.  return $target_image

PS:该代码应用于命令行模式,且需要注意图片文件夹路径。

Tags: PHP照片拼接 PHP打印输出

分享到: