[点晴永久免费OA]【JavaScript】JS前端实现压缩图片功能
当前位置:点晴教程→点晴OA办公管理信息系统
→『 经验分享&问题答疑 』
为什么要前端来压缩图片 最近在做一个移动端h5上传图片的功能,本来这个功能并不复杂,只需要将图片文件通过axios传到服务端即可,但是考虑到现在手机设配的拍照功能十分强大,随便一张照片都能动辄五六兆,而服务端的要求是上传图片必须小于两兆,而且直接传这么大图片,带宽它也受不了,所以前端进行压缩图片就成了一个必要的环节。 压缩效果 首先介绍下压缩的大概流程
接下来看下详细步骤 考虑到文章和步骤的完整性,所以我会把每个细节都写出来,即使有些东西很基础。 1. 使用Input标签来获取图片文件资源 这一步大家应该最熟悉不过了吧,原生input标签,通过设置 点击控件,触发焦点,打开文件资源管理器,选中文件并确认后,会触发change事件,所以可以在change事件的回调中获取选中文件,它长这个样 2. 读取文件转成img标签元素 拿到图片文件后,先将其转成HTMLImageElement,也就是普通的img标签,具体要使用 FileReader构造函数。 先new出来一个img和fileReader的实例,通过fileReader的 readAsDataURL这个api,来读取图片文件,其返回值是一个编码后的base64的字符串,然后将这个字符串赋值给img的src属性上,这样就完成了图片文件到 HTMLImageElement的转化。 转化的HTMLImageElement 3. canvas压缩,核心步骤 拿到转化后的img元素后,先取出该元素的宽高度,这个宽高度就是实际图片文件的宽高度。 然后定义一个最大限度的宽高度,如果超过这个限制宽高度,则进行等比例的缩放 计算好将要压缩的尺寸后,创建canvas实例,设置canvas的宽高度为压缩计算后的尺寸,并将img绘制到上面 4. 转成blob文件 canvas绘制完成后,就可以使用 toBlob来将图像转成blob文件了,这个api接受三个入参 回调函数中可以得到转化后的blob文件,type为要转成的图片类型,默认png。 encoderOptions为当设置的图片格式为 所以如果我们只是要压缩jpg或者webp格式的图片的话,不需要进行第3部的操作,直接使用这个api,然后填入想要的质量参数就可以了。但实际上,我们还是要考虑多种的图片格式,因此很有必要使用第三部的过程。 转成的blob长这个样子 5. 将blob上传,大功告成。 完整的代码实现 因为整个过程中都存在着异步回调操作,所以我使用了async,实现异步代码的同步执行 大致执行过程,具体可根据需求,自行改动 该文章在 2023/5/6 12:36:58 编辑过 |
关键字查询
相关文章
正在查询... |