使用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. template.js 求和 问题

    基本适应方法在这不做叙述 <table> <tr> <th>值</th> <th>值</th> <th>值</ ...

  2. Redis主从复制(读写分离)(四)

    Redis主从复制(读写分离) 克隆三台linux虚拟机   9.1.1.克隆虚拟机   9.1.2.生成新的mack地址 9.1.3.主从复制配置 redis主从复制 概述 1.redis的复制功能 ...

  3. 【2-sat】8.14B. 黑心老板

    2-sat 只写过板子 题目大意 有一个长度为$k$取值只有01的序列,现在$n$个人每人下注三个位置,请构造一个序列使每个人最多猜对一个位置 $k\le 5000,n \le 10000$ 题目分析 ...

  4. <script language= "javascript " for= "window " event= "onload ">

    狼-志 EVENT   event   设置或获取脚本编写用于的事件   FOR   htmlFor   设置或获取绑定到事件脚本的对象. 可以这样理解. <script   language= ...

  5. The Reset Method of Te Philips VTR 5210

    Pull down and hold the ON/OFF buttun, Then press the play button

  6. Linq to XML - C#生成XML

    1.System.Xml.XmlDocument  XML file转成字符串  string path3 = @"C:\Users\test.xml";  XmlDocument ...

  7. C# params object[] args 可以传多个参数,可以不限制类型

    http://blog.csdn.net/wslyy99/article/details/1836486 C#参数数组(params)的使用方法 http://www.vcsos.com/articl ...

  8. elasticsearch利用head插件

    restful接口使用方法 RESTful接口URL的格式: http://localhost:9200///[] 其中index.type是必须提供的. id是可选的,不提供es会自动生成. ind ...

  9. Leetcode题目64.最小路径和(动态规划-中等)

    题目描述: 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入: [ [1,3,1], [1, ...

  10. legend3---15、像粉丝数、关注数、课程数等数量数据如何处理

    legend3---15.像粉丝数.关注数.课程数等数量数据如何处理 一.总结 一句话总结: 在主表中加入这种数量字段:比如在用户表中加入粉丝数,关注数字段 普通更新:增加数量的时候将数据插入到关联表 ...