<?php
namespace app\mapi\common\image;
/**
* 拼接多幅图片成为一张图片
*
* 参数说明:原图片为文件路径数组,目的图片如果留空,则不保存结果
*
* 例子:
* <code>
* $ci = new CombineImage(array("./uploads/1.jpg", "./uploads/2.png"), "./uploads/3.png");
* $ci->combine();
* $ci->show();
* </code>
*
* @author yangjianhui
* @version 2020/6/13
*/
class CombineImage
{
/**
* 原图地址数组
*/
private $srcImages;
/**
* 每张图片缩放到这个宽度
*/
private $width;
/**
* 每张图片缩放到这个高度
*/
private $height;
/**
* 目标图片地址
*/
private $destImage; /**
* 临时画布
*/
private $canvas; /**
* CombineImage constructor.
*
* @param array $srcImages 需要图片路径数组
* @param string $desImage 输出目标图片地址
* @param int $width 输出后图片宽度
* @param int $height 输出后图片高度
*/
public function __construct(array $srcImages, $desImage = '', $width = 750, $height = 12144)
{
$this->srcImages = $srcImages;
$this->destImage = $desImage;
$this->width = $width;
$this->height = $height;
$this->canvas = NULL;
} public function __destruct()
{
if ($this->canvas != NULL) {
imagedestroy($this->canvas);
}
} /**
* 合并图片
*/
public function combine()
{
if (empty($this->srcImages) || $this->width == 0 || $this->height == 0) {
return;
} /*获取所有图片高度*/
$heightAll = 0;
for ($i = 0; $i < count($this->srcImages); $i++) {
$srcImage = $this->srcImages[$i];
list($srcWidth, $srcHeight, $fileType) = getimagesize($srcImage);
if ($fileType == 2) {
$srcImage = imagecreatefromjpeg($srcImage);
} else if ($fileType == 3) {
$srcImage = imagecreatefrompng($srcImage);
} else {
continue;
}
$heightAll+=$srcHeight;
} $this->height = $heightAll;
$this->createCanvas(); for ($i = 0; $i < count($this->srcImages); $i++) {
$srcImage = $this->srcImages[$i];
//获取原图的基本信息(切记不要https)
list($srcWidth, $srcHeight, $fileType) = getimagesize($srcImage);
if ($fileType == 2) {
// 原图是 jpg 类型
$srcImage = imagecreatefromjpeg($srcImage);
} else if ($fileType == 3) {
// 原图是 png 类型
$srcImage = imagecreatefrompng($srcImage);
} else {
// 无法识别的类型
continue;
} // 计算当前原图片应该位于画布的哪个位置
$destX = 0;
if ($i == 0) {
$desyY = 0;
} else {
$desyY += $srcHeight;
} imagecopyresampled($this->canvas, $srcImage, $destX, $desyY,
0, 0, $srcWidth, $srcHeight, $srcWidth, $srcHeight);
// echo $desyY.'--';
} // die;
// 如果有指定目标地址,则输出到文件
if (!empty($this->destImage)) {
$this->output();
}
} /**
* 输出结果到浏览器
*/
public function show()
{
if ($this->canvas == NULL) {
return;
}
header("Content-type: image/jpeg");
imagejpeg($this->canvas);
} /**
* 私有函数,创建画布
*/
private function createCanvas()
{
$this->canvas = imagecreatetruecolor($this->width, $this->height);
// 使画布透明
$white = imagecolorallocate($this->canvas, 255, 255, 255);
imagefill($this->canvas, 0, 0, $white);
imagecolortransparent($this->canvas, $white);
} /**
* 私有函数,保存结果到文件
*/
private function output()
{
// 获取目标文件的后缀
$fileType = substr(strrchr($this->destImage, '.'), 1);
if ($fileType == 'jpg' || $fileType == 'jpeg') {
imagejpeg($this->canvas, $this->destImage);
} else {
// 默认输出 png 图片
imagepng($this->canvas, $this->destImage);
} }
} ?>

最新文章

  1. java之Timer
  2. poj1458 Common Subsequence ——最长公共子序列
  3. VC文件夹大小(转)
  4. Android 程序目录及UI的简介
  5. POJ3259Wormholes(判断是否存在负回路)
  6. opencv face-detection 代码分析 (1)人脸识别后的数据
  7. Web App和Native App 谁将是未来
  8. 解决Access restriction问题
  9. Linux下 Apache Vhost 配置 防止403
  10. (转)Windows下cmd nginx的启动,重启,关闭功能
  11. 100-days: twenty-four
  12. 【Apache Kafka】Kafka学习笔记
  13. Linux系统开发之路 - 下
  14. 【转载】 强化学习(八)价值函数的近似表示与Deep Q-Learning
  15. 原生js实现ajax用于简单的签到或登录
  16. sql server 日志传送问题整理
  17. .NET:枚举的默认值
  18. java Web的MVC最基础暂定分层包
  19. centos:开启和关闭selinux
  20. Visual Studio 2015 正式版镜像下载(含专业版/企业版KEY)

热门文章

  1. Markdown基础知识
  2. BCE和CE交叉熵损失函数的区别
  3. echarts常用功能封装|抽象为mixin
  4. 使用 Vim 搭建 Python 开发环境
  5. ERP应收应付的操作与设计--开源软件诞生21
  6. Redis学习笔记(六)——数据结构之Set
  7. C语言基础-C简介
  8. [Luogu P2891/POJ 3281/USACO07OPEN ]吃饭Dining
  9. 【USACO】Strolling Cows
  10. C++语言学习之STL 的组成