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、图片压缩可以提取个方法,然后限制大小用传参的方式

    等等。。。

  • 相关阅读:
    遗传算法中适值函数的标定与大变异算法
    遗传算法中几种不同选择算子及Python实现
    BZOJ_4025_二分图_线段树按时间分治+并查集
    BZOJ_1818_[Cqoi2010]内部白点 _扫描线+树状数组
    BZOJ_3165_[Heoi2013]Segment_线段树
    UOJ_21_【UR #1】缩进优化_数学
    UOJ_14_【UER #1】DZY Loves Graph_并查集
    BZOJ_5359_[Lydsy1805月赛]寻宝游戏_DP
    BZOJ_2813_奇妙的Fibonacci_线性筛
    51nod_1236_序列求和 V3 _组合数学
  • 原文地址:https://www.cnblogs.com/chao202426/p/14734266.html
Copyright © 2011-2022 走看看