前端如何压缩图片在进行上传给后端

前端压缩图片我目前能想到的就是 通过canvas 改变图片的 画质去改变图片的大小。

解决方案如下:

1、首先获取图片的全部内容,然后转化为base64让他可以在页面上展示。

2、当我们获取到base64的图片的时候我们就可以获取图片的大小尺寸。

3、我们把这个图片放置到canvas上面去,然后通过cavans属性drawImg重新获取图片。

4、将重新获取的图片转化为url。

注意注意:当前只支持jpg图片的压缩,因为手机拍出来的图片是jpg图片。这是我的场景需要,如果你是png不建议你用,或者你有更好的方案可以也给我说说~~~

js 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div class="btn">上传</div>
</body>

</html>
<script>

    let btn = document.querySelector('.btn');
    class CompressImg {
        fileReader = new FileReader();
        constructor(options) {
            this.options = options;
            this.createBase64();
        }
        createBase64() {
            // console.log(fileRender)
            this.fileReader.onload = (e) => {
                console.log(e.target?.result, '---')
                this.compress(e.target?.result)
            }
            this.fileReader.readAsDataURL(this.options.file);
        }
        compress(url) {
            const img = new Image();
            img.src = url;
            const canvas = document.createElement('canvas');
            const ctx = canvas.getContext('2d');
            ctx.height = img.height;
            ctx.width = img.width;
            img.onload = () => {
                ctx.drawImage(img, 0, 0, img.width, img.height);
                const base = canvas.toDataURL(this.options.file.type, this.options.quality);
                this.options.success(base);

            }
        }
    }

    btn.addEventListener('click', () => {
        showOpenFilePicker().then(async (file) => {
            const files = await file[0].getFile();
            if (files) {
                new CompressImg({
                    file: files,
                    quality: 1,
                    success: (url) => {
                        console.log(url)
                    }
                })
            }
        })
    })
</script>

效果:

相关推荐
江上月513几秒前
JMeter中级指南:从数据提取到断言校验全流程掌握
java·前端·数据库
代码猎人2 分钟前
forEach和map方法有哪些区别
前端
恋猫de小郭3 分钟前
Google DeepMind :RAG 已死,无限上下文是伪命题?RLM 如何用“代码思维”终结 AI 的记忆焦虑
前端·flutter·ai编程
m0_4711996311 分钟前
【小程序】订单数据缓存 以及针对海量库存数据的 懒加载+数据分片 的具体实现方式
前端·vue.js·小程序
编程大师哥12 分钟前
Java web
java·开发语言·前端
A小码哥14 分钟前
Vibe Coding 提示词优化的四个实战策略
前端
Murrays14 分钟前
【React】01 初识 React
前端·javascript·react.js
大喜xi17 分钟前
ReactNative 使用百分比宽度时,aspectRatio 在某些情况下无法正确推断出高度,导致图片高度为 0,从而无法显示
前端
helloCat18 分钟前
你的前端代码应该怎么写
前端·javascript·架构
电商API_1800790524718 分钟前
大麦网API实战指南:关键字搜索与详情数据获取全解析
java·大数据·前端·人工智能·spring·网络爬虫