使用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. BZOJ2278 [Poi2011]Garbage[欧拉回路求环]

    首先研究环上性质,发现如果状态不变的边就不需要动了,每次改的环上边肯定都是起末状态不同的边且仅改一次,因为如果有一条边在多个环上,相当于没有改,无视这条边之后,这几个环显然可以并成一个大环.所以,我们 ...

  2. [CTS2019]田野(80分)

    loj嘟嘟嘟 学完模拟退火后开始搞这道题,搞了一下午最终搞到了80分,剩下的实在不知道怎么办了-- 首先肯定是把有交点的线段划分到一个集合,然后对每一个集合求一遍凸包. 然后两两合并,如果新的凸包的周 ...

  3. 二维DFT

    学习DIP第4天 傅里叶变换数学原理会在后续完整介绍,目前只实现代码,观察下结果,公式在上一篇博客中已经描述 内容迁移至 http://www.face2ai.com/DIP-2-2-二维DFT/ h ...

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

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

  5. 在Idea中 的terminal 使用 git

    参考该博客内容 http://blog.csdn.net/qq_28867949/article/details/73012300

  6. 权势二进制(51Nod 1413)

    一个十进制整数被叫做权势二进制,当他的十进制表示的时候只由0或1组成.例如0,1,101,110011都是权势二进制而2,12,900不是. 当给定一个n的时候,计算一下最少要多少个权势二进制相加才能 ...

  7. asmlinkage的用法

    转自:https://www.cnblogs.com/china_blue/archive/2010/01/15/1648523.html https://blog.csdn.net/liujiaoy ...

  8. JavaWeb_(Hibernate框架)Hibernate论坛项目中多对多案例

    基于SSH论坛小型项目 传送门 用户和发帖进行举例 多对多关系:多个用户可以回复多个帖子 因此引入了一张回复表,用来保存用户id和帖子id CREATE TABLE `hforum`.`answer` ...

  9. requests_html使用asyncio

    import asyncio import functools from concurrent.futures.thread import ThreadPoolExecutor from reques ...

  10. 从JMS到KafKa

    从JMS到KafKa JMS (1)JMS概念 JMS(Java Message Service,java消息服务)API是一个消息服务的标准或者说是规范,允许应用程序组件基于JavaEE平台创建.发 ...