需求

有一个由图片地址组成的数组,要将这个数组中的所有图片拼接成一张图片,并返回图片地址或者展示出来

解决方案

思路:创建一个函数,将图片数组做为参数。函数内部循环图片数组,将图片依次使用 canvas 拼接到一起。

// list 为图片数组
function mergeImgs(list) {// 创建一个 img 节点,用于显示拼接完成后的图片const imgDom = document.createElement('img')document.body.appendChild(imgDom)// 创建 canvas 节点并初始化const canvas = document.createElement('canvas')canvas.width = 500canvas.height = 500 * list.lengthconst context = canvas.getContext('2d')// 循环图片数组list.map((item, index) => {const img = new Image()img.src = item// 跨域img.crossOrigin = 'Anonymous'// 图片加载完成后再拼接img.onload = () => {context.drawImage(img, 0, 500 * index, 500, 500)const base64 = canvas.toDataURL('image/png')imgDom.setAttribute('src', base64)// console.log(baseList)}})
}const urlList = ['./img/timg%20(1).jpg', './img/timg.jpg']
mergeImgs(urlList )

上面代码有些缺陷,图片加载慢时,会闪屏。如果后续逻辑需要使用拼接完成的图片,无法保证后续拿到的图片是否是最终版,因为 img.onload 是异步的。
下面使用 Promise 稍微优化一下,降低代码耦合性,改成公共方法。

/*** 合并多张图片,返回新的图片* @param {Array} list 图片url数组* @param {Number} cwith 画布宽度 默认500* @param {Number} cheight 画布高度 默认500*/
function mergeImgs(list, cwith = 500, cheight = 500) {return new Promise((resolve, reject) => {const baseList = []// 创建 canvas 节点并初始化const canvas = document.createElement('canvas')canvas.width = cwithcanvas.height = cheight * list.lengthconst context = canvas.getContext('2d')list.map((item, index) => {const img = new Image()img.src = item// 跨域img.crossOrigin = 'Anonymous'img.onload = () => {context.drawImage(img, 0, cheight * index, cwith, cheight)const base64 = canvas.toDataURL('image/png')baseList.push(base64)if (baseList[list.length - 1]) {console.log(baseList)// 返回新的图片resolve(baseList[list.length - 1])}}})})
}const urlList = ['./img/timg%20(1).jpg', './img/timg.jpg']
mergeImgs(urlList ).then(base64 => {const imgDom = document.createElement('img')imgDom.src = base64document.body.appendChild(imgDom)
})

这样就可以保证在 then 中拿到的是正确图片了

效果

js使用Canvas将多张图片合并成一张相关推荐

  1. uniapp怎么使用canvas把两张图片合并成一张图片

    首先,在你的 vue 组件中引入 uni-canvas: <template><view class="canvas-container"><uni- ...

  2. java 将图片分割成9张_将多张图片合并成一张,代码(可垂直和水平方向合并)...

    importjava.awt.image.BufferedImage;importjava.io.File;importjava.io.IOException;importjavax.imageio. ...

  3. Windows10 把两张图片合并成一张图片

    Windows10把两张图片合并成一张图片 文章目录 Windows10把两张图片合并成一张图片 1. 背景 2. "画图"实现多图拼接 1. 背景 相比截图功能,在 Google ...

  4. Java实现多张图片合并成一份PDF文件

    Java实现多张图片合并成一份PDF文件,一行两列展示 引入依赖包 <dependency><groupId>com.lowagie</groupId><ar ...

  5. PIL实现两张图片合成一张,和图片加文字

    PIL实现两张图片合成一张,和图片加文字 文章目录: 一.PIL实现两张图片合成一张 1.方法一: 2.方法二 二.图片添加文字 首先说明一下: (小姐姐是谁,是my sweetheart ,请勿使用 ...

  6. 什么相片可以两张弄成一张_ps怎么把两张图片合成一张

    ps怎么把两张图片合成一张 图片应用在我们的生活中十分广泛,Photoshop似乎已经离不开我们的生活.点点滴滴回忆刻印成一张张图片.不过有不少网友却不知道ps怎么把两张图片合成一张,下文将一一为大家 ...

  7. 如何将两张图片合成一张pdf

    在职场工作中,学会处理PDF文件是必不可少的技能.由于PDF文档的特殊性,许多新手在编辑PDF文件时往往不知道从何入手.比如一些非pdf格式的文件,像图片,在使用的时候被指定必须使用pdf格式的,这个 ...

  8. android 两张电信_两张图片合成一张app-2张图片合成一张app下载1.2.9 官方安卓版-西西软件下载...

    两张图片合成一张app是一款可以把手机上的2张图片合成一张并且看不出是合成的图片的工具,玩转2张图片叠加,可以让你和偶像合照不是梦很逼真的!带你打造与众不同的作品!可以制作双重曝光效果的APP,带你打 ...

  9. 如何将几张图片拼成一张长图,多方法详解

    如何将几张图片拼成一张长图?遇到这个问题,我们首先想到是用手机上的工具来进行,比如秀秀就可以实现,但是要注意的是手机软件进行操作的时候很有可能会压缩图片,而且图片上传也是有限制的.限制拼接图片的大小. ...

  10. 微信小程序绘制海报,或者把多张图片合成一张

    微信小程序绘制海报,或者把多张图片合成一张,例子 <image style='height:{{mabgh}}px;width:{{mabgw}}px;' class="savepng ...

最新文章

  1. PC-如何提高计算机的启动和关机的速度?
  2. db2有MySQL那样的时间戳_MySQL 按照日期格式查询带有时间戳数据
  3. 原创:PHP内核研究:HASH表和变量
  4. 后端用java还是python_【后端开发】已学php再学java还是python?
  5. SQL Server内存架构基础
  6. 推荐系统笔记二、矩阵分解协同过滤
  7. Learn RxJava
  8. YUM更换源(1)--yum找不到安装包
  9. 寻找节点d=n的节点算法
  10. APP自动化-显示等待/强制等待/命令等待
  11. 股票群的骗术 ,几乎99%的QQ群
  12. ADF单位根检验三种形式_读文4:面板数据模型建立步骤、面板数据模型设定检验(F test)、面板协整模型(ADF test)...
  13. 快嘴企业名录搜索 2007 是什么
  14. python自回归_向量自回归模型(VAR)到底厉害在哪里?
  15. oracle 软件证书错误,IE上ORACLE OEM 证书错误 , 导航阻止,无法”继续浏览此网站”...
  16. p2p与反p2p的博弈,一劳永逸真的不容易么
  17. 计算机教学模式有待创新,计算机软件教学中教学评价模式的创新与探索
  18. [BZOJ]4453: cys就是要拿英魂!
  19. 如何写一个proto消息
  20. Html编码(#数字型)与解码小结 - 针对Puny Code(中文域名)的解码处理

热门文章

  1. Hive窗口函数之preceding and following
  2. 81192 祖国期盼着你返航
  3. 菜菜的sklearn机器学习实战——全部课件
  4. 机器学习实战中的心得体会
  5. speedoffice(PPT)怎么将背景设置为渐变背景
  6. UVA - 1389 Hard Life【分数规划+最小割】【最大权闭合图】
  7. Swipe轮播插件的使用
  8. 上周回顾:DNS漏洞被泄 华为辞职门再起风波
  9. 小程序图形验证码输入校验例子
  10. javascript原生脚本代码 飘浮广告