使用input标签选择一张图片, 然后利用canvas对图片进行切割, 可以设置切割的行数和列数

这是html代码

...
<input type="file" id="input">
...

这是js代码

class SplitImage {
constructor (options) {
this.options = {
col: 3,
row: 3,
inputEle: ''
}
this.options = Object.assign({}, this.options, options)
if (!this.options.inputEle) {
throw new Error('Options.inputEle is invalid! Please check!')
}
this.input = null
this.canvas = null
this.ctx = null
this.img = null
this.init()
}
init () {
this.input = document.querySelectorAll(this.options.inputEle)[0]
this.input.onchange = this.fileChange.bind(this)
this.createCanvas()
}
async fileChange () {
let file = this.input.files[0]
try {
let base64 = await this.fileReader(file)
try {
await this.createImg(base64)
this.splitImg()
} catch (e) {
console.log(e)
}
} catch (e) {
console.log(e)
}
}
fileReader (file) { // 读取文件base64
return new Promise((resolve, reject) => {
const reader = new FileReader()
reader.readAsDataURL(file)
reader.onload = (e) => {
const result = e.target.result
resolve(result)
}
reader.onerror = (e) => {
reject(e)
}
})
}
createImg (base64) { // 加载图片
return new Promise((resolve, reject) => {
const img = new Image()
img.onload = (e) => {
this.img = img
resolve()
}
img.onerror = (e) => {
console.log(e)
reject(e)
}
img.src = base64
})
}
createCanvas () { // 创建canvas
this.canvas = document.createElement('canvas')
this.ctx = this.canvas.getContext('2d')
}
drawImg (options = {}) { // 绘制图片
this.canvas.width = options.width
this.canvas.height = options.height
this.ctx.drawImage(this.img, options.x, options.y, options.width, options.height, 0, 0, options.width, options.height)
const base64 = this.canvas.toDataURL()
let img = document.createElement('img')
img.src = base64
img.style.border = '5px solid red'
img.style.marginBottom = '-5px'
document.body.appendChild(img)
}
splitImg () { // 切割图片
let list = []
for (let y = 0; y < this.options.row; y++) {
for (let x = 0; x < this.options.col; x++) {
let simpleWidth = parseInt(this.img.width / this.options.col)
let simpleHeight = parseInt(this.img.height / this.options.row)
list.push({
x: x * simpleWidth,
y: y * simpleHeight,
width: simpleWidth,
height: simpleHeight
})
}
}
list.forEach(item => {
this.drawImg(item)
})
}
}
let splitImage = new SplitImage({
col: 2, // 切割图片的列数
row: 2, // 切割图片的行数
inputEle: '#input' // 标签选择器
})

这是原图

这是切割之后的图片,分成了3*3的9宫格图片,为了看得更清楚, 我给图片都加上了5px的黑色边框

利用canvas对图片进行切割的更多相关文章

  1. 前端JS利用canvas的drawImage()对图片进行压缩

    对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验. 这种体验包括两方面: 1.由于上传图片尺寸比较小,因此上传速度会比较快,交互会更加流畅,同时大大降低了网络异常导致 ...

  2. 利用 canvas 破解 某拖动验证码

    利用 canvas 破解 某拖动验证码 http://my.oschina.net/u/237940/blog/337194

  3. 利用Canvas进行绘制XY坐标系

    首先来一发图 绘制XY的坐标主要是利用Canvas setLeft和setBottom功能(Canvas内置坐标的功能) 1.首先WPF中的坐标系都是从左到右,从上到下的 即左上角位置(0,0)点,所 ...

  4. 利用canvas实现的中点Bresenham算法

    Bresenham提出的直线生成算法的基本原理是,每次在最大位移方向上走一步,而另一个方向是走步还是不走步取决于误差项的判别,具体的实现过程大家可以去问度娘.我主要是利用canvas画布技术实现了这个 ...

  5. 利用canvas压缩图片

    现在手机拍的照片动不动就是几M,当用户上传手机里的照片时一个消耗流量大,一个上传时间长,为了解决这个问题,就需要压缩图片: 想法:利用canvas重绘图片,保持宽高比不变,具体宽高根本具体情况而定. ...

  6. HTML5利用canvas,把多张图合并成一张图片

    需求分析,根据当前网页中的几张图片,在手机上长按,保存图片到相册或者发送给好友. drawCanvas(){ var self = this; var imgsrcArray = [ require( ...

  7. 利用canvas将网页元素生成图片并保存在本地

    利用canvas将网页元素生成图片并保存在本地 首先引入三个文件: 1.<script type="text/javascript" src="js/html2ca ...

  8. 利用canvas对上传图片进行上传前压缩

    利用谷歌调式工具发现,图片大小直接影响着首屏加载时间. 且考虑到后期服务端压力,图片压缩特别必要. 本文是前端利用canvas实现图片.参考文章:https://www.cnblogs.com/007 ...

  9. 10分钟,利用canvas画一个小的loading界面

    首先利用定义下canvas得样式 <canvas width="1024" height="720" id="canvas" styl ...

随机推荐

  1. python Flask中html模版中如何引用css,js等资源

    已有静态页面,需要将其整合到瓶的项目中,需要搞清楚, 之前的HTML中的: <link rel =“stylesheet”href =“css / framework7.ios.css”> ...

  2. 嵌入式系统FreeRTOS — 互斥信号量

    互斥信号量可以在资源保护的时候很有帮助.用于控制在两个或多个任务间访问共享资源.任务1里面用互斥,那么任务2只能等任务1访问完再访问同一个变量. 比如全局变量double gADC_value[CH_ ...

  3. [转载]ORM-PetaPoco 小型ORM框架

    轻量级ORM-PetaPoco及改进 作者:帮助您   发布:2013-04-26 06:03   分类:软件综合问题   阅读:371次   评论关闭     PetaPoco描述 PetaPoco ...

  4. 移动端H5开发问题记录

    1. 当弹出键盘时,会改变页面高度,影响页面样式 通过window.onsize事件可以控制键盘弹出或消失的时候的样式 var h = document.body.scrollHeight // 用o ...

  5. 洛谷P4979 矿洞:坍塌

    洛谷题目链接 珂朵莉树吼啊!!! 又是一道水题,美滋滋~~~ $A$操作完全模板区间赋值 $B$操作也是一个模板查询,具体看代码 注意:读入不要用$cin$,会$T$,如果你是大佬,会玄学东西当我没说 ...

  6. java学习第一天:环境的配置

    1.下载JDK,当前版本下载地址为:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.htm ...

  7. LA 6979 Known Notation 构造+贪心 铜牌题

    题意:给出一个字符串,有两种操作: 1.插入一个数字  2.交换两个字符   问最少多少步可以把该字符串变为一个后缀表达式(操作符只有*) #include <cstdio> #inclu ...

  8. java中Switch的实现原理浅谈

    switch的转换和具体系统实现有关,如果分支比较少,可能会转换为跳转指令(条件跳转指令和无条件跳转指令).但如果分支比较多,使用条件跳转会进行很多次的比较运算,效率比较低,可能会使用一种更为高效的方 ...

  9. jQuery系列(十二):事件委托

    1.什么是事件委托 通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这 ...

  10. java 面试心得总结-BAT、网易

    http://blog.csdn.net/sinat_26812289/article/details/50898693