JS 图片压缩原理与实现方法详解

JS 图片压缩原理与实现方法详解

原理介绍

图片压缩是指在保证图片质量的前提下,通过降低图片的分辨率、压缩比率等方式来减小图片的体积,从而达到优化页面加载速度的目的。在网页中,对于图片的大小不同,会直接影响页面的加载速度,特别是对于移动端的用户体验更加重要。

在实现 JavaScript 图片压缩的时候,常见的有两种方式:

  • HTML5 的 Canvas + toDataURL 方法;

  • JavaScript 的 atob 和 btoa 方法。

其中,在使用 Canvas + toDataURL 方法时,通过将图片加载到 Canvas 画布上面,再将 Canvas 转为 base64 编码的字符串,并通过“压缩比”设置实现图片压缩。

而在使用 atob 和 btoa 方法时,通过利用浏览器提供的 atob 和 btoa 方法,将原图片数据转换成二进制数据,并通过设置“压缩比”实现游览器端图片压缩。

实现步骤

方式一:Canvas + toDataURL

1. 加载图片到 Canvas 画布中

var img = new Image();
img.src = 'original.jpg';
img.onload = function() {
  var canvas = document.createElement('canvas');
  var ctx = canvas.getContext('2d');
  canvas.width = img.width;
  canvas.height = img.height;
  ctx.drawImage(img, 0, 0, img.width, img.height);
}

2. Canvas 转为 base64 编码的字符串

var quality = 0.6; // 压缩比例
var dataURL = canvas.toDataURL('image/jpeg', quality); // 转为 JPEG 格式

方式二:atob 和 btoa

1. 将图片读取为二进制数据

// 读取图片的原始数据
var xhr = new XMLHttpRequest();
xhr.open('GET', 'original.jpg', true);
xhr.responseType = 'blob';
xhr.onload = function() {
  if (xhr.status === 200) {
    var reader = new FileReader();
    reader.onload = function(e) {
      var dataUrl = e.target.result;
      // dataUrl 经过 btoa 后压缩比变化
      var compressedDataURL = _compressImg(dataUrl, 0.6);
    }
    reader.readAsDataURL(xhr.response);
  }
};
xhr.send();

2. 将二进制数据转为 base64 编码的字符串

function _compressImg(dataUrl, quality) {
  var img = new Image();
  img.src = dataUrl;
  var canvas = document.createElement('canvas');
  var ctx = canvas.getContext('2d');
  canvas.width = img.width;
  canvas.height = img.height;
  ctx.drawImage(img, 0, 0, img.width, img.height);
  var imageData = canvas.toDataURL('image/jpeg', quality);
  return imageData;
}

示例说明

示例一

假设我们有一张 2000 x 2000 像素的图片,使用方式一压缩图片,并设置压缩比为 0.6,代码如下:

var img = new Image();
img.src = 'original.jpg';
img.onload = function() {
  var canvas = document.createElement('canvas');
  var ctx = canvas.getContext('2d');
  canvas.width = img.width;
  canvas.height = img.height;
  ctx.drawImage(img, 0, 0, img.width, img.height);

  var quality = 0.6; // 压缩比例
  var dataURL = canvas.toDataURL('image/jpeg', quality); // 转为 JPEG 格式

  console.log('原始图片大小:', img.src.length);
  console.log('压缩后图片大小:', dataURL.length);
};

输出结果为:

原始图片大小: 1588163
压缩后图片大小: 275235

可以看到使用该方法可以达到将图片体积减小到原始大小的 17% 左右。

示例二

假设我们有一张 4000 x 4000 像素的图片,使用方式二压缩图片,并设置压缩比为 0.4,代码如下:

var xhr = new XMLHttpRequest();
xhr.open('GET', 'original.jpg', true);
xhr.responseType = 'blob';
xhr.onload = function() {
  if (xhr.status === 200) {
    var reader = new FileReader();
    reader.onload = function(e) {
      var dataUrl = e.target.result;
      // dataUrl 经过 btoa 后压缩比变化
      var compressedDataURL = _compressImg(dataUrl, 0.4);

      console.log('原始图片大小:', dataUrl.length);
      console.log('压缩后图片大小:', compressedDataURL.length);
    }
    reader.readAsDataURL(xhr.response);
  }
};
xhr.send();

function _compressImg(dataUrl, quality) {
  var img = new Image();
  img.src = dataUrl;
  var canvas = document.createElement('canvas');
  var ctx = canvas.getContext('2d');
  canvas.width = img.width;
  canvas.height = img.height;
  ctx.drawImage(img, 0, 0, img.width, img.height);
  var imageData = canvas.toDataURL('image/jpeg', quality);
  return imageData;
}

输出结果为:

原始图片大小: 4699401
压缩后图片大小: 881580

可以看到使用该方法可以达到将图片体积减小到原始大小的 19% 左右。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS 图片压缩原理与实现方法详解 - Python技术站

(1)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • vue函数@click.prevent的使用解析

    当我们使用Vue.js开发前端应用时,经常会在模版中使用@click指令来响应用户的点击事件,在一般情况下,点击事件会导致页面的跳转或刷新等行为,但是有时候我们需要控制点击事件的默认行为,这时候就需要使用@click.prevent修饰符。 @click.prevent能够阻止点击事件的默认行为,例如在表单的提交按钮中使用@click.prevent可以阻止…

    Vue 2023年5月28日
    00
  • JS正则匹配URL网址的方法(可匹配www,http开头的一切网址)

    下面是JS正则匹配URL网址的方法(可匹配www,http开头的一切网址)的完整攻略: 首先,我们需要先了解一下正则表达式。正则表达式是一种专门描述字符串特征的方式,可以用来验证输入是否符合标准格式、搜索或替换字符串等。 接下来,我们需要知道匹配URL网址的正则表达式。以下是匹配URL网址的正则表达式,可以匹配www,http开头的一切网址: /^((htt…

    Vue 2023年5月28日
    00
  • vue2.0开发入门笔记之.vue文件的生成和使用

    当我们使用 Vue.js 进行开发的时候,最普遍的方式就是通过 .vue 文件进行组件化开发。本次攻略将详细讲解 .vue 文件的生成和使用。 什么是 .vue 文件? .vue 文件是一种组件化的文件格式,Vue.js 是通过 .vue 文件进行组件开发。.vue 文件将一个组件的 HTML、CSS 和 JavaScript 内容放在同一个文件中,便于管理…

    Vue 2023年5月28日
    00
  • vue3版本网页小游戏设计思路

    下面就详细讲解“vue3版本网页小游戏设计思路”的完整攻略。 一、介绍 Vue 3是一款前端开发框架,它能够帮助我们快速、高效地开发网页应用。本文将介绍如何使用Vue 3开发一个简单的网页小游戏。 二、设计思路 本次小游戏的开发思路如下: 使用Vue 3来构建界面,使用Vue Router来管理页面路由; 使用Canvas绘制游戏界面、角色和道具; 使用We…

    Vue 2023年5月27日
    00
  • Vue组件间通信方式全面汇总介绍

    下面我将详细讲解“Vue组件间通信方式全面汇总介绍”的完整攻略。 1. 前言 在Vue的开发中,组件间通信是很常见的需求。要想做好组件间通信,我们必须要掌握不同的组件通信方式。本篇文章将全面汇总介绍Vue组件间通信的方式,希望能够对Vue的学习者有所帮助。 2. 父子组件通信 2.1 父传子 父组件向子组件通信,可以通过props属性来传递。具体实现方法如下…

    Vue 2023年5月29日
    00
  • uni-app微信小程序使用echarts的详细图文教程

    针对“uni-app微信小程序使用echarts的详细图文教程”,我给出下面的攻略: uni-app微信小程序使用echarts的详细图文教程 前言 uni-app是一个跨平台开发框架,可使用一套代码快速开发出各种应用,包括微信小程序。而echarts则是一款强大的可视化图表库,支持多种图表类型,且功能丰富。将它们结合使用,可以快速的实现数据可视化,提高用户…

    Vue 2023年5月27日
    00
  • 浅谈vue-props的default写不写有什么区别

    让我来详细讲解一下”浅谈vue-props的default写不写有什么区别”。 什么是vue-props? 在Vue.js框架中,组件是一个可复用、可包含任意代码的模块。每个组件往往都有自己的属性或状态,这些属性或状态需要传递给子组件或父组件,这就是props的作用。 Vue中的props属性类似于React.js组件中的props属性,用于接收外部传递的数…

    Vue 2023年5月28日
    00
  • vue 内置过滤器的使用总结(附加自定义过滤器)

    下面是详细讲解“vue 内置过滤器的使用总结(附加自定义过滤器)”的完整攻略,过程中将给出两个示例来说明。 1. vue 内置过滤器 Vue 提供了一些内置的过滤器,用于快速展示数据的不同格式。这些过滤器可以在插值表达式和 v-bind 指令中使用。 1.1 文本格式化 {{message | capitalize}}: 将信息的第一个字母大写。 {{mes…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部