PHP實(shí)現(xiàn)將幾張照片拼接到一起的合成圖片功能【便于整體打印輸出】
本文實(shí)例講述了PHP實(shí)現(xiàn)將幾張照片拼接到一起的合成圖片功能。分享給大家供大家參考,具體如下:
<?php
/**
* 作品合成程序
* 針對(duì)單面,封面不做特殊處理
*/
$src_path = $argv[1]; // php該文件,第一個(gè)參數(shù)是文件夾名(作品集),可相對(duì)路徑
$dst_path = '../image/'.$src_path; // 生成文件存放的目標(biāo)位置
if (!file_exists($dst_path)){
mkdir($dst_path);
}
// 合成圖推薦大小,單頁(yè)大小建議:1120*1600
$g_width = 1120;
$g_height = 1600;
$g_border = 20; // 邊框
// 模板
// 圖片張數(shù)=>array(位置=>array(x,y,width,height))
$g_models = array(
1=>array( // 單頁(yè)總張數(shù)
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;
}
}
// 判斷圖片總數(shù)
if(count($jpgs) != 52){
echo '圖片總數(shù)有誤:'.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 本頁(yè)圖片集合
* @return resource 合成后的圖片
*/
function imagemake($files=array()){
global $g_width,$g_height,$g_models;
// 合成后的圖片
$image_all = imageCreatetruecolor($g_width,$g_height);
// 為真彩色畫布創(chuàng)建白色背景
$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 目標(biāo)寬度
* @param $target_height 目標(biāo)高度
* @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;
}
// 橫豎構(gòu)圖不同,旋轉(zhuǎn)
if(($target_width-$target_height)*($source_width-$source_height)<0){
// 旋轉(zhuǎn)
$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:該代碼應(yīng)用于命令行模式,且需要注意圖片文件夾路徑。
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP圖形與圖片操作技巧匯總》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》及《PHP數(shù)學(xué)運(yùn)算技巧總結(jié)》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
PHP異常Parse error: syntax error, unexpected T_VAR錯(cuò)誤解決方法
在PHP中根本不需要使用var聲明的,但是當(dāng)一個(gè)變量作為一個(gè)類的成員變量的時(shí)候,使用var還是沒有問題的2014-05-05
PHP開發(fā)API接口簽名生成及驗(yàn)證操作示例
這篇文章主要介紹了PHP開發(fā)API接口簽名生成及驗(yàn)證操作,結(jié)合實(shí)例形式較為詳細(xì)的分析了PHP開發(fā)API接口簽名生成及驗(yàn)證操作相關(guān)原理、實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下2020-05-05
php實(shí)現(xiàn)建立多層級(jí)目錄的方法
這篇文章主要介紹了php實(shí)現(xiàn)建立多層級(jí)目錄的方法,需要的朋友可以參考下2014-07-07
php方法調(diào)用模式與函數(shù)調(diào)用模式簡(jiǎn)例
函數(shù)調(diào)用模式時(shí),this被綁定到全局對(duì)象。這種情況在對(duì)象的屬性與方法被初始化時(shí)也能夠得到反應(yīng)。2011-09-09
php報(bào)錯(cuò)502badgateway解決方法
在本篇文章里小編給大家整理了關(guān)于php報(bào)錯(cuò)502badgateway解決方法相關(guān)知識(shí)點(diǎn),有需要的朋友們參考下。2019-10-10
PHP+MySQL實(shí)現(xiàn)模糊查詢員工信息功能示例
這篇文章主要介紹了PHP+MySQL實(shí)現(xiàn)模糊查詢員工信息功能,結(jié)合實(shí)例形式分析了php連接mysql數(shù)據(jù)庫(kù)及使用like語(yǔ)句進(jìn)行模糊查詢與顯示相關(guān)操作技巧,需要的朋友可以參考下2018-06-06

