加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

浅析图片上传及canvas压缩的流程

发布时间:2020-06-17 04:39:35 所属栏目:编程 来源:站长网
导读:我们凡是在做图片上传的时辰城市赶上这样的环境,一是后端接口限定上传图片的巨细,大附崆纵然后端没有限定巨细,由于图片太大在前端渲染时太慢,造成页面加载体验较差。因此我们很有须要对上传的图片举办压缩。 本文在gitthub做了收录:github.com/Michae

我们凡是在做图片上传的时辰城市赶上这样的环境,一是后端接口限定上传图片的巨细,大附崆纵然后端没有限定巨细,由于图片太大在前端渲染时太慢,造成页面加载体验较差。因此我们很有须要对上传的图片举办压缩。

本文在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)名目标数据,然后通过该数据实现了图片预览的成果

<div class="container"> <input type="file" accept="image/*" onchange="loadFile(event)" /> </div> <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,把blobappend 到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压缩内容请搜刮剧本之家早年的文章或继承赏识下面的相干文章,但愿各人往后多多支持剧本之家!

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读