记php多张图片 合并生成竖列 纵向长图(可用于商品详情图合并下载)
<?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多张图片 合并生成竖列 纵向长图(可用于商品详情图合并下载)的更多相关文章
- Entity Framework问题:ReferentialConstraint 中的依赖属性映射由存储生成的列
原文:Entity Framework问题:ReferentialConstraint 中的依赖属性映射由存储生成的列 今天在采用Entity Framework 的Database First反向以 ...
- 在Excel中把横行与竖列进行置换、打勾号
在Excel中把横行与竖列进行置换:复制要置换的单元,在新的单元上右键->选择性复制,会出现对话框,选中“置换”,即可在Excel中打勾号,左手按住ALT不放,右手在小键盘也就是右边的数字键盘依 ...
- ReferentialConstraint 中的依赖属性映射到由存储生成的列
ReferentialConstraint 中的依赖属性映射到由存储生成的列 这个问题是由于从表中的外键关系建立错误(可能是由于误改),查看从表的所有外键关系,即可找到问题所在. 问题: 什么是从表? ...
- CSS实现文字竖排 DIV CSS文字垂直竖列排版显示如何实现?
DIV CSS实现文字竖排排版显示兼容各大浏览器,让文字垂直竖列排版布局. 有时我们需要一段文字进行从上到下竖列排版,我们知道CSS样式中有一样式可以让其竖列排版,但所有浏览器不全兼容,逼不得已放弃. ...
- js合并table指定列
function MergeTableCell(tableId, startRow, endRow, col) { var tb = document.getElementById(tableId); ...
- 使用Teleport Ultra批量克隆网站,使用Easy CHM合并生成chm文件
1.要下载的页面 http://www.howsoftworks.net/javaapi/ 2. 下载Teleport Ultra 3.使用Teleport Ultra批量克隆网站 4.下载Easy ...
- 查询自动生成Guid列
--newid()可以在查询的时候自动生成Guid列 ' ordey by Random --创建对应的列 用 uniqueidentifier 类型 IF NOT EXISTS ( SELECT * ...
- php将一个二维数组按照某个字段值合并成一维数组,如果有重复则将重复的合并成二维数组
版权声明:本文为博主原创文章,未经博主允许不得转载. 最近工作中碰到一个问题,用PHP将一个二维数组按照二维数组中的各个项中的某个特定字段值合并成一维数组,如果有重复则将重复的合并成二维数组,生成的二 ...
- 一个分门别列介绍JavaScript各种常用工具的脑图
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:一个分门别列介绍JavaScript各种常用工具的脑图.
随机推荐
- 圆形进度条的模仿3-DrawArc,DrawCircle,DrawText,自定义属性实例讲解
前面两篇中已经讲过如何使用drawARC,等,画其他的图形的方法的使用也是一样的,只是参数不同, 同时也讲了如何通过xml进行自定义属性,接下来这篇便是通过实例讲解如何实地应用起来, 效果如下,点击开 ...
- jmeter环境变量配置
参考博客:超全 https://blog.csdn.net/qq_39720249/article/details/80721777
- Linux入门到放弃之八《任务计划管理》
任务计划管理 1.每周一下午5:50将/data目录下的所有目录和文件归档并压缩为:backup.tar.gz 放在/home/backup目录下. 先新建/data目录,并在目录中随意生成几个文件 ...
- <img>元素边距问题
解决方式: 给 img 元素设置成 "块" display:block; 另一种 vertical-align: bottom;
- 用 Span 对 C# 进程中三大内存区域进行统一访问 ,太厉害了!
一:背景 1. 讲故事 前段时间写了几篇 C# 漫文,评论留言中有很多朋友多次提到 Span,周末抽空看了下,确实是一个非常
- jvm内存查看方法----个人参考版
查看设置JVM内存信息 1 Runtime.getRuntime().maxMemory(); //最大可用内存,对应-Xmx 2 3 Runtime.getRuntime().freeMemory( ...
- Nginx 配置请求响应时间
1.常见默认nginx.conf配置日志格式 log_format main '$remote_addr - $remote_user [$time_local] "$request&quo ...
- 【CF1443E】Long Permutation 题解(排列生成模板)
原题链接 题意简介 给定一个长度为 n 的排列 {1,2,3,...,n} .现有两种操作: 对某个区间 [l,r] 求和 将排列往后推 x 次 (按字典序) 其中 \(n,q \leq 2\time ...
- 老大说新项目的结构和 xxx 项目一样就可以了,我 ……(使用 Maven Archetype 快速创建项目)
前言 又要开发新项目了,还是创建新项目,怎么办?老大说按照 xxx 项目的结构创建一个新项目就可以了. 公众号:liuzhihangs,记录工作学习中的技术.开发及源码笔记:时不时分享一些生活中的见闻 ...
- day83:luffy:添加购物车&导航栏购物车数字显示&购物车页面展示
目录 1.添加购物车+验证登录状态 2.右上方购物车图标的小红圆圈数字 3.Vuex 4.购物车页面展示-后端接口 5.购物车页面展示-前端 6.解决一个购物车数量显示混乱的bug 1.添加购物车+验 ...