图片的压缩---使用canvas进行压缩(简洁版)

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <meta http-equiv="X-UA-Compatible" content="ie=edge">

    <title>Document</title>

</head>

<body>

    <input id="file" type="file">

<script>

// 代码来源于廖雪峰博客,是最实用的,也是最简洁的,但有个问题就是图片过小,‘压缩’后会更大,这个区间大概是1.5M以内,所以超过1.5M才进行此canvas压缩

 

var eleFile = document.querySelector('#file');

// 压缩图片需要的一些元素和对象

var reader = new FileReader(), img = new Image();

// 选择的文件对象

var file = null;

// 缩放图片需要的canvas

var canvas = document.createElement('canvas');

var context = canvas.getContext('2d');

 

 

// base64地址图片加载完毕后

img.onload = function () {

    // 图片原始尺寸

    var originWidth = this.width;

    var originHeight = this.height;

    // 最大尺寸限制

    var maxWidth = 400, maxHeight = 400;

    // 目标尺寸

    var targetWidth = originWidth, targetHeight = originHeight;

    // 图片尺寸超过400x400的限制

    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上传

        var xhr = new XMLHttpRequest();

        // 文件上传成功

        xhr.onreadystatechange = function() {

            if (xhr.status == 200) {

                // xhr.responseText就是返回的数据

            }

        };

        // 开始上传

        xhr.open("POST", 'upload.php', true);

        xhr.send(blob);    

    }, file.type || 'image/png');

};

 

// 文件base64化,以便获知图片原始尺寸

reader.onload = function(e) {

    img.src = e.target.result;

};

eleFile.addEventListener('change', function (event) {

    file = event.target.files[0];

    console.log('压缩前的尺寸大小',file.size)

    // 选择的文件是图片

    if (file.type.indexOf("image") == 0) {

        reader.readAsDataURL(file);    

    }

});

</script>

</body>

</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值