canvas图片裁剪插件(浅析图片上传及canvas压缩的流程)
canvas图片裁剪插件
浅析图片上传及canvas压缩的流程我们通常在做图片上传的时候都会遇上这样的情况,一是后端接口限制上传图片的大小,或者是即使后端没有限制大小,因为图片太大在前端渲染时太慢,造成页面加载体验较差。因此我们很有必要对上传的图片进行压缩。
本文在gitthub做了收录:github.com/Michael-lzg…
本文主要包括以下流程:
- 用户通过
input
框选择图片 - 使用
FileReader
进行图片预览 - 将图片绘制到
canvas
画布上 - 使用
canvas
画布的能力进行图片压缩 - 将压缩后的
Base64(DataURL)
格式的数据转换成Blob
对象进行上传
Input 标签来获取图片
通过设置input
标签的type
属性为file
,来让用户可以选择文件,设置accept
限制选择的文件类型,绑定onchange
事件,来获取确认选择后的文件
<input type="file" accept="image/*" onchange="loadFile(event)"
FileReader
FileReader
是什么,我们先来看看官方文档的介绍
FileReader 对象允许 Web 应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。
FileReader
常用的两个方法如下:
FileReader.onload
:处理load
事件。即该钩子在读取操作完成时触发,通过该钩子函数可以完成例如读取完图片后进行预览的操作,或读取完图片后对图片内容进行二次处理等操作。FileReader.readAsDataURL
:读取方法,并且读取完成后,result
属性将返回Data URL
格式(Base64 编码)的字符串,代表图片内容。
在图片上传中,我们可以通过readAsDataURL()
方法进行了文件的读取,并且通过result
属性拿到了图片的Base64(DataURL)
格式的数据,然后通过该数据实现了图片预览的功能
<li class="container"> <input type="file" accept="image/*" onchange="loadFile(event)" /> </li> <script> const loadFile = function (event) { let file = event.target.files[0] const reader = new FileReader() reader.onload = function () { console.log(reader.result) ... } reader.readAsDataURL(file) } </script>
canvas 压缩图片
这是图片上传压缩的核心所在,我们先使用CanvasRenderingContext2D.drawImage()
方法将上传的图片文件在画布上绘制出来,再使用Canvas.toDataURL()
将画布上的图片信息转换成base64(DataURL)
格式的数据。
drawImage()
drawImage()
方法在画布上绘制图像、画布或视频。drawImage()
方法也能够绘制图像的某些部分,以及/或者增加或减少图像的尺寸。参数如下
- img 规定要使用的图像、画布或视频。
- sx 可选。开始剪切的 x 坐标位置。
- sy 可选。开始剪切的 y 坐标位置。
- swidth 可选。被剪切图像的宽度。
- sheight 可选。被剪切图像的高度。
- x 在画布上放置图像的 x 坐标位置。
- y 在画布上放置图像的 y 坐标位置。
- width 可选。要使用的图像的宽度。(伸展或缩小图像)
- height 可选。要使用的图像的高度。(伸展或缩小图像)
var cas = document.querySelector('canvas') var ctx = cas.getContext('2d') // 先创建图片对象 var img = new Image() img.src = './images/1.jpg' // 图片加载完之后 img.onload = function () { ctx.drawImage(img, 206, 111, 32, 38, 100, 100, 32, 38) }
Canvas.toDataURl()
Canvas.toDataURl()
方法可以将canvas
画布上的信息转换为base64(DataURL)
格式的图像信息,纯字符的图片表示形式。该方法接收 2 个参数:
mimeType
(可选): 表示需要转换的图像的mimeType
类型。默认值是image/png
,还可以是image/jpeg
,image/webp
等。quailty
(可选):quality 表示转换的图片质量。范围是 0 到 1。图片的mimeType
需要是image/jpeg
或者image/webp
,其他mimeType
值无效。默认压缩质量是 0.92。
var canvas = document.createElement('canvas') canvas.toDataURL("image/jpeg" 0.8)
到这里,我们先来上 canvas 压缩图片的代码
function compress(base64, quality, mimeType) { let canvas = document.createElement('canvas') let img = document.createElement('img') img.crossOrigin = 'anonymous' return new Promise((resolve, reject) => { img.src = base64 img.onload = () => { let targetWidth, targetHeight if (img.width > MAX_WIDTH) { targetWidth = MAX_WIDTH targetHeight = (img.height * MAX_WIDTH) / img.width } else { targetWidth = img.width targetHeight = img.height } canvas.width = targetWidth canvas.height = targetHeight let ctx = canvas.getContext('2d') ctx.clearRect(0, 0, targetWidth, targetHeight) // 清除画布 ctx.drawImage(img, 0, 0, canvas.width, canvas.height) let imageData = canvas.toDataURL(mimeType, quality / 100) resolve(imageData) } }) }
将 base64 转化为文件
- 通过
window.atob
将base-64
字符串解码为binaryString
(二进制文本); - 将
binaryString
构造为multipart/form-data
格式; - 用
Uint8Array
将multipart
格式的二进制文本转换为ArrayBuffer
。
function dataUrlToBlob(base64, mimeType) { let bytes = window.atob(base64.split(',')[1]) let ab = new ArrayBuffer(bytes.length) let ia = new Uint8Array(ab) for (let i = 0; i < bytes.length; i++) { ia[i] = bytes.charCodeAt(i) } return new Blob([ab], { type: mimeType }) }
将图片上传到服务端
创建一个FormData
,把blob
append 到FormData
里面请求服务端接口,提交图片
function uploadFile(url, blob) { let formData = new FormData() let request = new XMLHttpRequest() formData.append('image', blob) request.open('POST', url, true) request.send(formData) }
ps:在实际开发中,我们要不要把图片转化为FormData
形式上传到服务端,这就看具体的业务需要了。我们可以上图片上传到腾讯云,直接返回一个'https.xxx.jgp'
的图片 url 用于上传。
到此这篇关于浅析图片上传及canvas压缩的流程的文章就介绍到这了,更多相关图片上传canvas压缩内容请搜索开心学习网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持开心学习网!
- vue实现图片上传数据库(vue.js根据图片url进行图片下载)
- html5导入图片文件(HTML5 实现图片上传预处理功能)
- django用户上传文件怎么接收(Django框架文件上传与自定义图片上传路径、上传文件名操作分析)
- js 图片编辑处理库(javascript input图片上传及预览,FileReader预览图片)
- php上传图片视频代码(详解PHP素材图片上传、下载功能)
- canvas图片裁剪(使用canvas压缩图片上传的方法示例)
- think php上传服务器(ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例)
- vueaxios使用教程交流(Vue使用axios图片上传遇到的问题)
- canvas图片裁剪插件(浅析图片上传及canvas压缩的流程)
- thinkphp源码上传(ThinkPHP框架实现FTP图片上传功能示例)
- dede图片上传问题(DEDE图片集上传图片时出错显示FILEID的解决方法)
- php处理app上传的图片(php用wangeditor3实现图片上传功能)
- vue 富文本图片上传(vue.js云存储实现图片上传功能)
- 换代在即,现在是抄底 7.5代 高尔夫的最佳时机吗(换代在即现在是抄底)
- 2020年大众7.5代高尔夫R终结特别版 最后的呐喊(2020年大众7.5代高尔夫R终结特别版)
- 七年前的这部剧有毒,全剧只有女主红到发紫,男主至今无人认识(七年前的这部剧有毒)
- 宋轶除了演过于曼丽,原来还演过一个青楼女子(宋轶除了演过于曼丽)
- 赵丽颖第一部当女主的戏,主角配角个个都是实力演员(赵丽颖第一部当女主的戏)
- 乾隆为何这么喜爱白塔原因是什么(乾隆为何这么喜爱白塔原因是什么)
热门推荐
- vs项目依赖项
- python3循环使用教程(Python3.4学习笔记之 idle 清屏扩展插件用法分析)
- dedecms如何使用(DedeCMS织梦服务器网站目录安全设置经验分享)
- dedecms标签怎么调用(dedecms织梦系统内容页英文字母不换行的解决方法)
- 网站copyright怎么写
- canvas俄罗斯方块(JavaScript canvas实现俄罗斯方块游戏)
- vue源码系列教程(vue使用引用库中的方法附源码)
- mysql中常用的三种存储引擎的区别(MySQL 存储过程的优缺点分析)
- 云数据中心服务器介绍(云服务器的机房设备有哪些?)
- laravel视图组件(Laravel5.4框架中视图共享数据的方法详解)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9