56行JS代码轻松解决图片压缩

前言

1、现在使用网页上传图片的场景越来越多,相机拍照的图片通常在3-5M之间,大多场景都不需要这么高分辨率的图片,图片太大可能影响上传速度,占用空间等。

压缩函数 compression-image.js

/**
 * 压缩图像函数
 * 
 * @param {Object} option 选项
 * option 选项对象属性介绍:
 * ->file:文件对象
 * ->maxWidth:图片最大宽度,默认值:1200
 * ->maxHeight:图片最大高度,默认值:1000
 * ->quality:图片质量,取值范围:0-1,默认值:0.6
 * ->error:压缩失败回调,唯一参数:e ,Error对象
 * ->callback:压缩成功回调,唯一参数:result ,属性介绍:
 * ----->file:源图片文件
 * ----->base64:压缩后的base64
 * ----->blob:压缩后的blob文件对象
 * ----->size:压缩后的文件大小,单位:byte
 * ----->type:图片类型
 */
function compressionImage(option) {
    if (!option) return;
    try {
        var file = option.file
        if (!file) throw new Error('file null')
        if (file.type.indexOf('image/') != 0) throw new Error('file type not image')
        var maxWidth = option.maxWidth || 1200
        var maxHeight = option.maxHeight || 1000
        var quality = option.quality || 0.6
        var callback = option.callback
        var reader = new FileReader();
        var canvas = document.createElement('canvas');
        var context = canvas.getContext('2d');
        var img = new Image();
        img.onload = function () {
            var originWidth = this.width;
            var originHeight = this.height;
            var targetWidth = originWidth;
            var targetHeight = originHeight;
            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.width = targetWidth;
            canvas.height = targetHeight;
            context.clearRect(0, 0, targetWidth, targetHeight);
            context.drawImage(img, 0, 0, targetWidth, targetHeight);
            canvas.toBlob(function (blob) {
                var reader = new FileReader();
                reader.readAsDataURL(blob);
                reader.onload = function (e) {
                    if (callback && typeof callback === 'function') callback({
                        file: file,
                        size: e.total,
                        base64: e.target.result,
                        blob: blob,
                        type: blob.type
                    })
                }
            }, file.type, quality);
        };
        reader.onload = function (e) {
            var r = e.target.result;
            img.src = r;
        };
        reader.readAsDataURL(file);
    } catch (e) {
        var error = option.error
        if (error && typeof error === 'function') error(e)
    }
}

测试代码 index.html


<!doctype html>
<html>

<head>
    <title>前端压缩</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport"
        content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
    <style>
        img {
            width: 100%;
            height: auto;
        }
    </style>
</head>


<body>
    <input id="file" type="file" accept="image/*">
    <p id="size"></p>
    <img id="img">
    <script src="compression-image.js"></script>
    <script type="text/javascript">
        var eleFile = document.querySelector('#file');
        eleFile.addEventListener('change', function (event) {
            file = event.target.files[0];
            compressionImage({
                file: file,
                callback: function (result) {
                    document.getElementById('size').innerText = '文件大小: ' + (result.size / 1024).toFixed(2) + ' KB\n   文件类型: ' + result.type
                    document.getElementById('img').src = URL.createObjectURL(result.blob);
                },
                error: function (e) {
                    console.error(e.message)
                }
            })
        });

    </script>

</body>

</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值