使用Canvas实现前端图片压缩

前言:有些WEB应用会在页面显示比较多的图片,当图片大小非常大的时候,页面加载会非常缓慢,影响用户体验。本文介绍一种前端方法(Canvas)实现前端图片压缩。

压缩效果:
这里写图片描述

选择图片文件

测试页面HTML:

<input id="img-files" type="file" accept="image/*" multiple/>
<ul id="img-list-before">
</ul>
<button id="compress">压缩</button>
<ul id="img-list-after">
</ul>

选择图片文件JS代码:

$("#img-files").on("change", function (e) {
    var files = e.target.files; // 事件对象

    // 循环显示图片预览
    var sHtml = "";
    for (var i = 0; i < files.length; i++) {
        var file = files[i], reader = new FileReader();
        reader.readAsDataURL(file); // 读取方式
        reader.onload = (function (reader) {
            return function (e) {
                sHtml = "<li class='img'><img src='" + e.target.result + "'/></li>";
                $("#img-list-before").append(sHtml);
            }
        })(reader);
    }
});

BTW,上面的代码中涉及到JS处理文件的一些API,如选取的文件列表读取:

// 几种读取文件列表的方法
var files = e.target.files; // 事件对象
var files = this.files; // 事件对象
var files = document.getElementById("img-files").files; // 纯JS
var files = $("#img-files")[0].files; // jQuery
var files = $("#img-files").prop("files"); // jQuery

还有,FileReader相关API的使用,例子中使用到了FileReader的两个属性:

  • FileReader.result : 文件的内容。该属性仅在读取操作完成后才有效,数据的格式取决于使用哪个方法来启动读取操作。
  • FileReader.onload : 处理load事件。该事件在读取操作完成时触发。

要读取文件的内容,可以放在onload事件中。文件的读取方式有多种,参见FileReader文件读取方式

图片压缩

运用canvas实现图片压缩:

function compress(img, width, height, ratio) { // img可以是dataURL或者图片url
    var canvas, ctx, img64;

    canvas = document.createElement('canvas');
    canvas.width = width;
    canvas.height = height;

    ctx = canvas.getContext("2d");
    ctx.drawImage(img, 0, 0, width, height);

    img64 = canvas.toDataURL("image/jpeg", ratio);

    return img64; // 压缩后的base64串
}

使用压缩方法:

var image = new Image();
image.src = $(".img").eq(0).find("img").attr("src");

image.onload = function(){
    var img64 = compress(image, 500, 400, 0.1);
    $("#img-list-after").append("<li><img src='" + img64 + "' /></li>");
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
压缩HTML: 可以使用多种工具来压缩HTML,例如HTMLMinifier或UglifyJS等。这些工具可以删除不必要的空格、注释和其他字符,从而减小文件大小。以下是使用HTMLMinifier进行HTML压缩的示例代码: ```javascript const html = '<html><head><title>Hello World</title></head><body><p>Hello, world!</p></body></html>'; const minifiedHtml = htmlMinifier.minify(html, { collapseWhitespace: true, removeComments: true, minifyCSS: true, minifyJS: true }); ``` 图片上传: 可以使用HTML5的File API来实现图片上传。以下是一个基本的示例: ```html <input type="file" id="upload-input"> <script> const input = document.getElementById('upload-input'); input.addEventListener('change', (e) => { const file = e.target.files[0]; const reader = new FileReader(); reader.onload = (event) => { const imageData = event.target.result; // 图片数据 // 将图片数据上传到服务器 }; reader.readAsDataURL(file); }); </script> ``` JS Canvas 修改图片尺寸和压缩大小: 可以使用canvas的API来修改图片的尺寸和压缩图片大小。以下是一个基本的示例: ```html <input type="file" id="upload-input"> <canvas id="canvas"></canvas> <script> const input = document.getElementById('upload-input'); const canvas = document.getElementById('canvas'); const context = canvas.getContext('2d'); input.addEventListener('change', (e) => { const file = e.target.files[0]; const reader = new FileReader(); reader.onload = (event) => { const img = new Image(); img.onload = () => { // 计算缩小后的尺寸 const maxWidth = 300; const maxHeight = 300; let width = img.width; let height = img.height; if (width > height) { if (width > maxWidth) { height *= maxWidth / width; width = maxWidth; } } else { if (height > maxHeight) { width *= maxHeight / height; height = maxHeight; } } canvas.width = width; canvas.height = height; // 绘制缩小后的图片 context.drawImage(img, 0, 0, width, height); // 压缩图片 const quality = 0.7; const imageData = canvas.toDataURL('image/jpeg', quality); // 将图片数据上传到服务器 }; img.src = event.target.result; }; reader.readAsDataURL(file); }); </script> ``` 以上是一个基本的实现,具体的实现方式可以根据需求进行修改。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值