<?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. Linux用户和组管理命令-切换用户su

    切换用户或以其他用户身份执行命令 su: 即 switch user,命令可以切换用户身份,并且以指定用户的身份执行命令 格式: su [options...] [-] [user [args...] ...

  2. 【计算几何 05】Pick定理

    什么是Pick定理(皮克定理) 来自wiki的介绍: 给定顶点座标均是整点(或正方形格子点)的简单多边形,皮克定理说明了其面积 \(A\)和内部格点数目 \(i\) .边上格点数目 \(b\) 的关系 ...

  3. Netty关闭连接流程分析

    在实际场景中,使用Netty4来实现RPC框架,服务端一般会验证协议,最简单的方法的协议探测,判断魔数是否正确.如果服务端无法识别协议会立即抛出异常,并主动关闭连接,此时客户端会收到read信号,在发 ...

  4. Sysbench测试神器:一条命令生成百万级测试数据

    1. 基准测试 基准测试(benchmarking)是性能测试的一种类型,强调的是对一类测试对象的某些性能指标进行定量的.可复现.可对比的测试. 进一步来理解,基准测试是在某个时候通过基准测试建立一个 ...

  5. LoadRunner接口脚本编写过程中遇到的问题及分享

    工作中需要接口测试,报文编辑器一条条手工发费时费力,因此考虑利用web_submit_data函数POST方法进行报文编辑.在报文编辑中主要遇到了三个问题,其中一个问题耗时两天查到问题所在,在这里与大 ...

  6. 云计算管理平台之OpenStack计算服务nova

    一.nova简介 nova是openstack中的计算服务,其主要作用是帮助我们在计算节点上管理虚拟机的核心服务:这里的计算节点就是指用于提供运行虚拟机实例的主机,通常像这种计算节点有很多台,那么虚拟 ...

  7. 走在深夜的小码农 Fifth Day

    Css3 Fifth Day writer:late at night codepeasant 学习大纲: 一.css三大特性 1.层叠性 ​ 相同选择器给设置相同的样式,此时一个样式就会覆盖(层叠) ...

  8. Django项目之打分系统

    打分系统 关注公众号"轻松学编程"了解更多. 项目GitHub地址:https://github.com/liangdongchang/VoteSys.git 1.开发需求 a. ...

  9. VC中句柄、指针、ID之间的转换

    win32直接操作的是句柄HANDLE,每个句柄就对应windows窗口,而vc对HANDLE进行类封装,间接操作的都是HANDLE,现在句柄只是类的一个成员变量. 从句柄到指针 CWnd* pWnd ...

  10. C#实现的几种委托方式介绍

    //普通委托            DeleteShow ds = new DeleteShow(ShowName);            Console.WriteLine("----- ...