PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
发布:smiling 来源: PHP粉丝网 添加日期:2021-08-19 10:32:37 浏览: 评论:0
这篇文章主要介绍了PHP实现将几张照片拼接到一起的合成图片功能,可实现多张图片的合并,便于整体打印输出.涉及php字符串、数组的遍历、排序及图片合成、裁剪、缩放等相关操作技巧,需要的朋友可以参考下。
本文实例讲述了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:该代码应用于命令行模式,且需要注意图片文件夹路径。
Tags: PHP照片拼接 PHP打印输出
- 上一篇:PHP封装的XML简单操作类完整实例
- 下一篇:浅谈PHP中如何实现Hook机制
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)