应业务要求,要把使用canvas截取的app每一屏的图片拼接在一起。图片的地址存放在一个log文件中。

先了解一下drawImage() 方法:

drawImage() 方法在画布上绘制图像、画布或视频。

drawImage() 方法也能够绘制图像的某些部分,以及/或者增加或减少图像的尺寸。

JavaScript 语法 1

在画布上定位图像:

context.drawImage(img,x,y);

JavaScript 语法 2

在画布上定位图像,并规定图像的宽度和高度:

context.drawImage(img,x,y,width,height);

JavaScript 语法 3

剪切图像,并在画布上定位被剪切的部分:

context.drawImage(img,sx,sy,swidth,sheight,x,y,width,height);

参数值

参数 描述
img 规定要使用的图像、画布或视频。
sx 可选。开始剪切的 x 坐标位置。
sy 可选。开始剪切的 y 坐标位置。
swidth 可选。被剪切图像的宽度。
sheight 可选。被剪切图像的高度。
x 在画布上放置图像的 x 坐标位置。
y 在画布上放置图像的 y 坐标位置。
width 可选。要使用的图像的宽度。(伸展或缩小图像)
height 可选。要使用的图像的高度。(伸展或缩小图像)

log文件:

var jsonData = [{"data": [{"url": "./db/cache/a.jpg"}, {"url": "./db/cache/b.jpg"}, {"url": "./db/cache/c.jpg"}]
}]

接下来就是根据log.js中的图片地址,把这些图片拼接在一起

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>拼长图</title>
</head>
<body><div id="image-container"></div><img src="" alt="" id="avatar"><script language="javascript" type="text/javascript" src="../../assets/js/jquery-2.0.3.min.js"></script><script language="javascript" type="text/javascript" src="./db/log/log.js"></script><script>// 拿到图片地址var dataList = []jsonData.forEach(item => {item.data.forEach(ele => {dataList.push(ele)})})//  绘制图片function draw(dataList, x, y) {var canvas = document.createElement("canvas");canvas.width = xvar context = canvas.getContext("2d");const encoderOptions = 1let length = dataList.lengthdataList.forEach((ele, i) => {canvas.height = y * (i + 1);var myImage = new Image();myImage.crossOrigin = '';myImage.src = ele.url; //你自己本地的图片或者在线图片myImage.onload = () => {context.drawImage(myImage, 0, y * i,480,640);var base64 = canvas.toDataURL("image/png", encoderOptions); //"image/png" 这里注意一下var img = document.getElementById('avatar');const imageDiv = document.getElementById('image-container')imageDiv.innerHTML =`<div><a download href=${base64} style="list-style: none;text-decoration: none;color:#000">点击下载长图</a><br><br><img src=${base64}></div>`}})}this.draw(dataList, 480, 640)</script>
</body></html>

最后的效果:

这个是通过读取log文件中存放的图片地址进行拼接的,如果有的小伙伴想要自己在input框中上传图片,并把图片拼接起来可以试试下面这段代码:

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>拼长图</title>
</head><body><input id="upload-input" type="file" accept="image/*" multiple="multiple" style="display: none;"><label for="upload-input">点击选择图片</label><div id="image-container"></div><script>// 拼出来的图片的宽度const width = 300// 拼出来的图片的质量,0-1之间,越大质量越好const encoderOptions =1const uploadInput = document.getElementById('upload-input')const imageDiv = document.getElementById('image-container')uploadInput.addEventListener('change', event => {const files = Array.from(event.target.files)filesToInstances(files, instances => {drawImages(instances, finalImageUrl => {imageDiv.innerHTML = `<div><a download href=${finalImageUrl}>点击下载</a><br><img src=${finalImageUrl}></div>`})})})// 根据图片文件拿到图片实例const filesToInstances = (files, callback) => {const length = files.lengthlet instances = []let finished = 0files.forEach((file, index) => {const reader = new FileReader()// 把文件读为 dataUrlreader.readAsDataURL(file)reader.onload = e => {const image = new Image()image.src = e.target.resultimage.onload = () => {// 图片实例化成功后存起来instances[index] = imagefinished ++if (finished === length) {callback(instances)}}}})}// 拼图const drawImages = (images, callback) => {const heights = images.map(item => width / item.width * item.height)const canvas = document.createElement('canvas')canvas.width = widthcanvas.height = heights.reduce((total, current) => total + current)const context = canvas.getContext('2d')let y = 0images.forEach((item, index) => {const height = heights[index]context.drawImage(item, 0, y, width, height)y += height})callback(canvas.toDataURL('image/jpeg', encoderOptions))}</script>
</body></html>

效果和上面图片拼接出来的一样,大家各取所需。input框上传图片并拼接参考:https://segmentfault.com/a/1190000011684333

有不对的地方欢迎指出,一起进步呀~

前端使用canvas拼接多张图片相关推荐

  1. 使用canvas将多张图片截取拼接成一张图片

    使用canvas将多张图片截取拼接成一张图片 业务场景 最近在做一个截取视频图片并拼接的小工具,其中就有个功能需要将多张图片截取拼接成一张图片的需求 上面就是将几张图片截取拼接成一张图片的效果图 实现 ...

  2. canvas拼接图片

    参考地址 canvas拼接图片 效果 横向拼接 纵向拼接 代码 html <!DOCTYPE html> <html lang="en"> <head ...

  3. python怎样把两个图画到一起_python实现两张图片拼接为一张图片并保存

    本文实例为大家分享了python实现两张图片拼接为一张图片并保存的具体代码,供大家参考,具体内容如下 这里主要用Python扩展库pillow中Image对象的paste()方法把两张图片拼接起来 f ...

  4. java 图片拼接_Java拼接多张图片,可以连接在一起 | 学步园

    /** * Java拼接多张图片 * * @param pics * @param type * @param dst_pic * @return */ public static boolean m ...

  5. python两张图片无缝合成一张,Python实现拼接多张图片的方法

    本文实例讲述了Python实现拼接多张图片的方法.分享给大家供大家参考.具体分析如下: 这里所述计划实现如下操作: ① 用Latex写原始博文,生成PDF文档; ② 将PDF转成高清的PNG格式的图片 ...

  6. python图像拼接_python实现两张图片拼接为一张图片并保存

    本文实例为大家分享了python实现两张图片拼接为一张图片并保存的具体代码,供大家参考,具体内容如下 这里主要用Python扩展库pillow中Image对象的paste()方法把两张图片拼接起来 f ...

  7. Python 把几张图片拼接成一张图片,并且写上文字

    把几张图片从上到下拼接成一张图片,并且写上文字 # 要拼接的图片名称是1,2,3...这样有顺序的 # 把当前目录下的所有图片从上到下拼接成一张图片 # 该图片的宽度是图片中最宽图片的宽度 # 不改变 ...

  8. Blob如何在html里转换成图片,前端图片canvas,file,blob,DataURL等格式转换

    前端图片canvas,file,blob,DataURL等格式转换最近用到一些图片相关的操作,记录一下笔记. 将file转化成base64 场景: 获取到一个file类型的图片,如果直接在html中预 ...

  9. python图片拼接成特定图案_Python 把几张图片拼接成一张图片,并且写上文字

    # 要拼接的图片名称是1,2,3...这样有顺序的 # 把当前目录下的所有图片从上到下拼接成一张图片 # 该图片的宽度是图片中最宽图片的宽度 # 不改变原来图片的大小,所以拼接后有的地方存在未填充的地 ...

  10. python将两张图片拼接成一张图_python实现两张图片拼接为一张图片并保存

    本文实例为大家分享了python实现两张图片拼接为一张图片并保存的具体代码,供大家参考,具体内容如下 这里主要用Python扩展库pillow中Image对象的paste()方法把两张图片拼接起来 f ...

最新文章

  1. 5s的app显示无法连接服务器,苹果5s无法连接app store解决方法汇总
  2. cpu调度的最小单位_Linux CFS调度器
  3. azkaban安装编译3.86 教程
  4. 空间谱专题02:波束形成(Beamforming)
  5. 基于面向对象的图片轮播(js原生代码)
  6. 信息学奥赛一本通(1220:单词接龙)
  7. 9:16 2009-7-30 范型,IList 做为参数
  8. 德州python培训_人工智能在多人桌德州扑克比赛中战胜世界顶尖选手
  9. 编程基础C——常量,变量,运算符个人总结
  10. C#- XPath教程
  11. BZOJ2002:[HNOI2010]弹飞绵羊——题解
  12. PHP数组键不存在给默认值
  13. C#大型医院管理系统源码
  14. c语言 符号怎么,c语言怎么说明符号
  15. mavennexus环境搭建
  16. 中国国际“互联网+”大学生创新创业大赛 武汉理工大学总决赛斩获双金
  17. a360desktop有用吗_A360 Desktop 停用 - 2018 年 6 月 19 日
  18. ddn(ddnnpap)
  19. 300道SpringCloud面试题及答案(最新整理)
  20. android系统流畅度排行,最流畅安卓手机排名:华为mate40Pro第六,第一堪比iOS!...

热门文章

  1. Android之高仿墨迹天气桌面组件(AppWidgetProvider)
  2. java 播放h264_一个可以解码并实时播放H264的播放器
  3. 工程图学与计算机绘图考查,工程图学与计算机绘图
  4. 【渝粤题库】广东开放大学 招投标与合同管理 形成性考核 (2)
  5. 网上书店管理系统mysql代码_网上书店管理系统数据库 sql sever
  6. xp计算机字体在哪,Windows XP系统字体库在哪-如何安装新字体
  7. 韩信点兵python算法_韩信点兵算法流程图
  8. myeclipse10破解补丁激活方法
  9. 网络管理员面试时常用的问题及答案
  10. android备份手机号码,Android QQ同步助手3.2 保证号码备份“不丢人”