zoukankan      html  css  js  c++  java
  • js前端图片压缩功能(canvas)

    前段时间准备换工作,去面试,被问到有没有自己实现过图片压缩,很尴尬,确实没有。于是,刚好有时间,就自己简单记录一下

    html:

    <input type="file" accept="image/*" @change="changeFile($event)" />

    js:

    changeFile(e) {
        const img = new Image();
        const reader = new FileReader();
        let file = e.target.files[0];
        //缩放图片需要的canvas
        let canvas = document.createElement('canvas');
        let context = canvas.getContext('2d');
        //判断选择的图片是否图片
        if (e.type.indexOf('image') == 0) {
            reader.readAsDataURL(file);
        }
        //文件base64化,以便获知图片原始尺寸
        reader.onload = function(even) {
            img.src = even.target.result;
        };
        //base64地址图片加载完毕后
        img.onload = function() {
            //图片原始尺寸
            let originWidth = this.width;
            let originHeight = this.height;
            console.log(originWidth, originHeight);
            //最大尺寸限制
            let maxWidth = 400;
            let maxHeight = 400;
            //目标尺寸
            let targetWidth = originWidth;
            let targetHeight = originHeight;
            //图片尺寸超过400*400的限制
            if (originWidth > maxWidth || originHeight > maxHeight) {
                if (originWidth / originHeight > maxWidth / maxHeight) {
                    //更宽,按照宽度限定尺寸
                    targetWidth = maxWidth;
                    targetHeight = Math.round(maxWidth * (originHeight / originWidth));
                } else {
                    targetHeight = maxHeight;
                    targetWidth = Math.round(maxHeight * (originWidth / originHeight));
                }
            }
            //canvas对图片进行缩放
            canvas.width = targetWidth;
            canvas.height = targetHeight;
            //清除画布
            context.clearRect(0, 0, targetWidth, targetHeight);
            //图片压缩
            context.drawImage(img, 0, 0, targetWidth, targetHeight);
            //canvas转为blob并上传
            canvas.toBlob(function(blob) {
                //图片ajax上传
                const formData = new FormData();
                formData.append('file', blob);
                //调用上传图片接口
                //axios.post('http://xxx.com/api',formData);
                //清除内容
                //e.target.value = '';
            }, file.type || 'image/png');
        };
    },

    还有很多可以优化的地方,比如

    1、将文件file转换成img可以提取个方法

    2、图片压缩可以提取个方法,然后限制大小用传参的方式

    等等。。。

  • 相关阅读:
    【django admin】外键关联中,如何选择一种属性后展示另外一种属性
    【UNI-APP】跳转外部链接 保留顶部
    【django 组件】admin修改界面
    【django基础】GET带参数与接口接收
    【Pythoin爬虫】使用网页copy xpath的坑==>tbody定位不到
    【Python小随笔】三行生成词云图
    【UNIAPP】接入导航系统完整版
    【UNIAPP】微信小程序接入腾讯地图 路线规划时,setData报错
    【部署接口】这里接口+admin后台管理,需要注意
    【UNI-APP】分页请求数据列表
  • 原文地址:https://www.cnblogs.com/chao202426/p/14734266.html
Copyright © 2011-2022 走看看