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


Posted in PHP onNovember 14, 2017

本文实例讲述了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;
}

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

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP投票系统防刷票判断流程分析
Feb 04 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
Dec 16 PHP
PHP SPL标准库中的常用函数介绍
May 11 PHP
php图像处理类实例
Jul 28 PHP
PHP获取二维数组中某一列的值集合
Dec 25 PHP
详解PHP中foreach的用法和实例
Oct 25 PHP
PHP registerXPathNamespace()函数讲解
Feb 03 PHP
PHP implode()函数用法讲解
Mar 08 PHP
laravel 执行迁移回滚示例
Oct 23 PHP
php将字符串转换为数组实例讲解
May 05 PHP
通过代码实例解析PHP session工作原理
Dec 11 PHP
PHP7 foreach() 函数修改
Mar 09 PHP
PHP封装的XML简单操作类完整实例
Nov 13 #PHP
PHP开发中解决并发问题的几种实现方法分析
Nov 13 #PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
Nov 13 #PHP
kindeditor 加入七牛云上传的实例讲解
Nov 12 #PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
Nov 12 #PHP
PHP 断点续传实例详解
Nov 11 #PHP
PHP+AJAX 投票器功能
Nov 11 #PHP
You might like
第四节 构造函数和析构函数 [4]
2006/10/09 PHP
win2003服务器使用WPS的COM组件的一些问题解决方法
2012/01/11 PHP
PHP高级对象构建 多个构造函数的使用
2012/02/05 PHP
php将access数据库转换到mysql数据库的方法
2014/12/24 PHP
php+MySql实现登录系统与输出浏览者信息功能
2016/07/01 PHP
Yii2针对指定url的生成及图片等的引入方法小结
2016/07/18 PHP
ThinkPHP3.2.3框架实现执行原生SQL语句的方法示例
2019/04/03 PHP
Jquery响应回车键直接提交表单操作代码
2014/07/25 Javascript
js中style.display=&quot;&quot;无效的解决方法
2014/10/30 Javascript
Easyui 之 Treegrid 笔记
2016/04/29 Javascript
js 将图片连接转换成base64格式的简单实例
2016/08/10 Javascript
jQuery双向列表选择器DIV模拟版
2016/11/01 Javascript
Bootstarp 基础教程之表单部分实例代码
2017/02/03 Javascript
JS中setTimeout和setInterval的最大延时值详解
2017/02/13 Javascript
easy ui datagrid 从编辑框中获取值的方法
2017/02/22 Javascript
Angular之指令Directive用法详解
2017/03/01 Javascript
详解有关easyUI的拖动操作中droppable,draggable用法例子
2017/06/03 Javascript
解决layui 复选框等内置控件不显示的问题
2018/08/14 Javascript
使用VUE实现在table中文字信息超过5个隐藏鼠标移到时弹窗显示全部
2019/09/16 Javascript
微信小程序封装多张图片上传api代码实例
2019/12/30 Javascript
es6数组includes()用法实例分析
2020/04/18 Javascript
原生JavaScript实现五子棋游戏
2020/11/09 Javascript
[01:16:37]【全国守擂赛】第三周决赛 Dark Knight vs. 一个弱队
2020/05/04 DOTA
Python计算两个日期相差天数的方法示例
2017/05/23 Python
Python多项式回归的实现方法
2019/03/11 Python
Python函数定义及传参方式详解(4种)
2019/03/18 Python
解决paramiko执行命令超时的问题
2020/04/16 Python
python中def是做什么的
2020/06/10 Python
如何基于Python爬取隐秘的角落评论
2020/07/02 Python
python3爬虫中多线程进行解锁操作实例
2020/11/25 Python
Hotels.com拉丁美洲:从豪华酒店到经济型酒店的预定优惠和折扣
2019/12/09 全球购物
女大学生自我鉴定
2013/12/09 职场文书
个人自我评价范文
2014/02/05 职场文书
2014年教师业务工作总结
2014/12/19 职场文书
2015年城管执法工作总结
2015/07/23 职场文书
五年级数学教学反思
2016/02/16 职场文书