前端js方式实现图片上传前缩放大小

直接贴代码

<html>
<head>
<title>前端js图片压缩</title>
<style>
#previewImg,#compressedImg{display:inline-block;width:300px;height:auto;}
#previewImg,#compressedImg{display:none;}
</style>
</head>
<body>
<input type="file" id="selectFile" />
<hr/>
<dl>
    <dt>压缩前的图片</dt>
    <dd><img src="" id="previewImg" /></dd>
    <dd id="beforeCompress"></dd>
</dl>
<canvas id="canvas" style="display: none;"></canvas>
<hr/>
<dl>
    <dt>压缩后的图片</dt>
    <dd><img src="" id="compressedImg" /></dd>
    <dd id="afterCompress"></dd>
</dl>
<hr/>
<div id="info"></div>

<script type="text/javascript">
var selectFile = document.getElementById("selectFile")
var previewImg = document.getElementById("previewImg")
var compressedImg = document.getElementById("compressedImg")

var beforeCompress = document.getElementById("beforeCompress")
var afterCompress = document.getElementById("afterCompress")

var info = document.getElementById("info")



// 这里是入口,获取上传时选择的文件流

selectFile.onchange = function(e) {
    var input = e.srcElement;
    var files = input.files;
    var file = files[0];

    var reader = new FileReader();
    reader.onload = function () {
        var img = new Image();
        img.src = reader.result;
        previewImg.setAttribute('src', img.src);
        previewImg.style = "display:inline-block;";
        img.onload = function () {
        
            // 注意:图像绘制时,必须保证资源已经加载完成
            
            var p1 = document.createElement('p')
            p1.innerHTML = `图片的原始宽度: ${img.naturalWidth}px`
            
            var p2 = document.createElement('p')
            p2.innerHTML = `图片的原始高度: ${img.naturalHeight}px`
            
            var p3 = document.createElement('p')
            p3.innerHTML = `图片的原始大小(byte): ${file.size}`
            
            beforeCompress.appendChild(p1)
            beforeCompress.appendChild(p2)
            beforeCompress.appendChild(p3)
            
            draw(img, file)
        }

    }
    reader.readAsDataURL(file);
}


function draw(img, file) {
    const canvas = document.getElementById('canvas');
    const ctx = canvas.getContext('2d');


    // 设置 canvas 的宽高,默认同比缩小1倍,其他缩放策略可自行设置。
    canvas.width = img.naturalWidth/2;
    canvas.height = img.naturalHeight/2;
    
    // 将图片绘制到 canvas 上
    ctx.drawImage(img, 0, 0, canvas.width, canvas.height);


    // 获取压缩后的图片数据



    // 可调整质量参数
    const compressedData = canvas.toDataURL(file.type, 0.7);



    // 创建一个新的压缩后的 File 对象
    const compressedFile = dataURItoBlob(compressedData, file.type);
    compressedFile.lastModifiedDate = file.lastModifiedDate;
    compressedFile.name = file.name;

    
    
    var reader = new FileReader();
    reader.onload = function () {
        var img = new Image();
        img.src = reader.result;
        compressedImg.setAttribute('src', img.src);
        compressedImg.style = "display:inline-block;";
        img.onload = function () {
 
            
            var p1 = document.createElement('p')
            p1.innerHTML = `压缩后图片的宽度: ${img.naturalWidth}px`
            
            var p2 = document.createElement('p')
            p2.innerHTML = `压缩后图片的高度: ${img.naturalHeight}px`
            
            var p3 = document.createElement('p')
            p3.innerHTML = `压缩后图片的原始大小(byte): ${compressedFile.size}`
            
            afterCompress.appendChild(p1)
            afterCompress.appendChild(p2)
            afterCompress.appendChild(p3)
            
            
            var p4 = document.createElement('p')
            p4.innerHTML = `压缩后图片的大小减少了: ${(parseFloat((file.size-compressedFile.size)/file.size).toFixed(2)*100)}%`;
            info.appendChild(p4)
        
            
        }

    }
    reader.readAsDataURL(compressedFile);
    
    
    
    
    
    // 这里是出口,compressedFile是文件流,继续后面上传的操作
    // uploadImage(compressedFile);


}

function dataURItoBlob(dataURI, mimeType) {
    const binary = atob(dataURI.split(',')[1]);
    const array = [];
    for (let i = 0; i < binary.length; i++) {
        array.push(binary.charCodeAt(i));
    }
    return new Blob([new Uint8Array(array)], { type: mimeType });
}

</script>
</body>
</html>

上效果

  • 38
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值