本文实例讲述了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:该代码应用于命令行模式,且需要注意图片文件夹路径。
PHP 合成 图片 照片