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

时间:2022-09-23 21:24:32

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
<?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程序设计有所帮助。

原文链接:http://blog.csdn.net/xwlyun/article/details/43793797