使用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. 05—动态sql

    1.创建表 CREATE TABLE tb_employee ( ID INT(11) PRIMARY KEY AUTO_INCREMENT, loginname VARCHAR(18), PASSW ...

  2. 虚拟机挂载U盘

    1.打开运行窗口输入services.msc回车 2.启动VMware USB Arbitration Service 3.打开虚拟机 进入编辑虚拟机设置 4.选择USB3.0  复选框全部勾选,点击 ...

  3. VMware虚拟机CentOS与宿主机共享目录

    正常情况下,在虚拟机CentOS中安装了vmware-tools后,配置完成共享目录,会自动在/mnt/hgfs下面出现共享目录. 如果该目录为空,并且通过命令:vmware-hgfsclient 的 ...

  4. [AHOI2007]密码箱 (数学 + 暴力)

    链接:https://ac.nowcoder.com/acm/problem/19877来源:牛客网 题目描述 在一次偶然的情况下,小可可得到了一个密码箱,听说里面藏着一份古代流传下来的藏宝图,只要能 ...

  5. 以组件的方式,添加redis_cache

    settings.py中文件内设置如下: CACHES = { 'default':{ 'BACKEND':'django_redis.cache.RedisCache', 'LOCATION':'r ...

  6. sed 和awk的执行方式

    sed 测试案例: 在有cat的行末开始追加<---,直到有dog的行结束 [root@L shells]# cat catDog.txt snake snake pig bird dog ca ...

  7. 通俗理解数字签名,ssl数字证书和https

    前言 最近在开发关于PDF合同文档电子签章的功能,大概意思就是在一份PDF合同上签名,盖章,使其具有法律效应.签章有法律效应必须满足两个条件: 能够证明签名,盖章者是谁,无法抵赖 PDF合同在签章后不 ...

  8. 微信小程序开发入门教程(四)---自己动手做个小程序

    前面已将基础知识准备的差不多了,下面实际做一个小程序. 一.目标 用于上传照片和文字. 2个主要页面:我me,设置set 二.开始制作 1.打开微信开发者工具(我用的1.02.1907160 Wind ...

  9. MySQL多表查询总结

    MySQL术语: Redundacncy(冗余):存储两次或多次数据,以便实现快速查询. Primary Key(主键):主键是唯一的.表中每条记录的唯一标识. Foreign Key(外键):用于连 ...

  10. LA 7043 International Collegiate Routing Contest 路由表 字典树离散化+bitset 银牌题

    题目链接:给你n(n<=3e4)个路由地址(注意有子网掩码现象), 路由地址:128.0.0.0/1的形式 要求你输出一个路由集合,其是给定的路由集合的补集,且个数越少越好 #include & ...