<?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);
} }
} ?>

记php多张图片 合并生成竖列 纵向长图(可用于商品详情图合并下载)的更多相关文章

  1. Entity Framework问题:ReferentialConstraint 中的依赖属性映射由存储生成的列

    原文:Entity Framework问题:ReferentialConstraint 中的依赖属性映射由存储生成的列 今天在采用Entity Framework 的Database First反向以 ...

  2. 在Excel中把横行与竖列进行置换、打勾号

    在Excel中把横行与竖列进行置换:复制要置换的单元,在新的单元上右键->选择性复制,会出现对话框,选中“置换”,即可在Excel中打勾号,左手按住ALT不放,右手在小键盘也就是右边的数字键盘依 ...

  3. ReferentialConstraint 中的依赖属性映射到由存储生成的列

    ReferentialConstraint 中的依赖属性映射到由存储生成的列 这个问题是由于从表中的外键关系建立错误(可能是由于误改),查看从表的所有外键关系,即可找到问题所在. 问题: 什么是从表? ...

  4. CSS实现文字竖排 DIV CSS文字垂直竖列排版显示如何实现?

    DIV CSS实现文字竖排排版显示兼容各大浏览器,让文字垂直竖列排版布局. 有时我们需要一段文字进行从上到下竖列排版,我们知道CSS样式中有一样式可以让其竖列排版,但所有浏览器不全兼容,逼不得已放弃. ...

  5. js合并table指定列

    function MergeTableCell(tableId, startRow, endRow, col) { var tb = document.getElementById(tableId); ...

  6. 使用Teleport Ultra批量克隆网站,使用Easy CHM合并生成chm文件

    1.要下载的页面 http://www.howsoftworks.net/javaapi/ 2. 下载Teleport Ultra 3.使用Teleport Ultra批量克隆网站 4.下载Easy ...

  7. 查询自动生成Guid列

    --newid()可以在查询的时候自动生成Guid列 ' ordey by Random --创建对应的列 用 uniqueidentifier 类型 IF NOT EXISTS ( SELECT * ...

  8. php将一个二维数组按照某个字段值合并成一维数组,如果有重复则将重复的合并成二维数组

    版权声明:本文为博主原创文章,未经博主允许不得转载. 最近工作中碰到一个问题,用PHP将一个二维数组按照二维数组中的各个项中的某个特定字段值合并成一维数组,如果有重复则将重复的合并成二维数组,生成的二 ...

  9. 一个分门别列介绍JavaScript各种常用工具的脑图

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:一个分门别列介绍JavaScript各种常用工具的脑图.

随机推荐

  1. Java9系列第7篇:Java.util.Optional优化与增强

    我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ...

  2. C++学习笔记---引用的本质

    本质:引用本质上是C++内部实现的一个指针常量 发现是引用的话,自动帮我们转换成指针常量 运行后,发现修改ref的值那么a的值也会一起改变,这就说明了引用的本质就是指针

  3. 大白话聊OSI七层模型和TCP/IP四层模型

    前言 今天和大家聊的是一个比较基础的问题,OSI七层模型和TCP/IP四层模型. 小伙伴们可能有疑问,这个东西还用写文章吗,太基础了吧,网上文章多的是,随便一搜索就能找到. 确实是这样,网上资料确实很 ...

  4. Rust借用机制的理解分析

    Rust初学者大多会遇到这样的问题: 为什么同一资源不可被同时可变借用和不可变借用? 为什么Rc一定只能是只读的,一定要配合std::cell系列(Cell,RefCell,UnsafeCell)才能 ...

  5. linux ssh自动输入密码,expect使用

    想搞一个使用ssh登录批量ip地址执行命令,自动输入密码的脚本,但是ssh不能使用标准输入来实现自动输入密码,于是了解到了expect这个可以交互的命令 是什么 查看使用man查看expect,是这么 ...

  6. Luban图片压缩

    导入依赖: implementation 'top.zibin:Luban:1.1.3' public class MainActivity extends AppCompatActivity { p ...

  7. c# vs2019 Window服务搭建

    一.创建一个Windows Service         我的IDE开发工具使用的是vs2019,和之前的vs版本不大相同,所有添加了详细的截图说明.         首先,选择新建项目,项目类型选 ...

  8. js中!!的运用

    最近在看vue源码. 里面使用Object.defineProperty()中!!吸引眼球 1 export function def (obj: Object, key: string, val: ...

  9. 使用 beeline 连接 hive 数据库报错处理

    一.beeline连接hive报错 1. User: root is not allowed to impersonate root (state=08S01,code=0) 在初次搭建完hadoop ...

  10. DevOps 视角的前后端分离与实战

    本文作者:CODING - 廖红坤 前言 随着微前端.微服务等技术理念和架构的蓬勃发展,我们已经没必要去讨论为什么要前后端分离这种话题,前后端分离已成为互联网项目开发的标准模式.前后端在各自的领域发展 ...