canvas压缩图片转换成base64格式输出文件流

yizhihongxing

下面是使用canvas压缩图片并转换为base64格式输出文件流的完整攻略:

步骤一:html文件部分

首先,我们需要在html文件中添加一个input元素,用于选择要上传的图片。代码如下:

<label for="image_upload">选择图片:</label>
<input type="file" accept="image/*" id="image_upload">

其中,type属性为file说明该元素是用于上传文件的。accept属性为image/*,表示只能上传图片类型的文件。

步骤二:JavaScript代码部分

接下来,我们需要编写JavaScript代码,使用canvas压缩图片并将其转换为base64格式的输出文件流。

步骤2.1:获取上传文件

首先,我们需要获取用户上传的图片文件。代码如下:

var input = document.getElementById('image_upload');
var file = input.files[0];

步骤2.2:使用canvas压缩图片并转换为base64格式的输出文件流

接下来,我们需要创建一个Image对象,并将待上传的图片文件赋值给该对象的src属性。然后,我们需要监听Image对象的load事件,将图片绘制到canvas上。最后,我们使用canvas的toDataURL方法将图片转换为base64格式的输出文件流。代码如下:

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

  var quality = 0.8; // 压缩比例,可调整
  var base64_data = canvas.toDataURL('image/jpeg', quality);
  console.log(base64_data);
};

上述代码中,canvas的宽度和高度分别设置为Image对象的宽度和高度。然后,我们使用drawImage方法将Image对象绘制到canvas上。toDataURL方法有两个参数。第一个参数是图片的MIME类型,也就是要输出的文件格式。第二个参数是图片的质量,取值范围是0到1。值越大,图片质量越高,但文件大小也越大。

至此,我们就完成了使用canvas压缩图片并转换为base64格式的输出文件流。

步骤2.3:完整代码示例

下面是使用canvas压缩图片并转换为base64格式输出文件流的完整代码示例:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>canvas压缩图片并转换为base64格式输出文件流</title>
</head>
<body>
  <label for="image_upload">选择图片:</label>
  <input type="file" accept="image/*" id="image_upload">
  <script>
    var input = document.getElementById('image_upload');
    var file = input.files[0];

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

      var quality = 0.8; // 压缩比例,可调整
      var base64_data = canvas.toDataURL('image/jpeg', quality);
      console.log(base64_data);
    };
  </script>
</body>
</html>

下面再介绍一个压缩多张图片的示例

代码片段如下

var compressImages = function(images, max_width, max_height, compress_ratio, callback) {
  var canvas = document.createElement('canvas')
  var ctx = canvas.getContext('2d')
  var compressed_images = []
  var completed_count = 0

  for (var i = 0; i < images.length; i++) {
    var img = images[i]
    var new_img = new Image()
    new_img.onload = (function(img, new_img, i) {
      return function () {
        canvas.width = Math.min(new_img.width, max_width)
        canvas.height = Math.min(new_img.height, max_height)
        var w = canvas.width, h = canvas.height
        var ratio
        if (new_img.width > max_width || new_img.height > max_height) {
          ratio = Math.min(max_width/new_img.width, max_height/new_img.height)
          w = new_img.width * ratio
          h = new_img.height * ratio
        }         
        ctx.clearRect(0, 0, w, h)
        ctx.drawImage(new_img, 0, 0, w, h)
        var base64_data = canvas.toDataURL('image/jpeg', compress_ratio)
        compressed_images[i] = base64_data
        completed_count++
        if (completed_count == images.length) {
          callback(compressed_images)
        }
      }
    })(img, new_img, i)
    new_img.src = URL.createObjectURL(img)
  }
}

这里我们封装了一个compressImages函数,该函数接受四个参数,分别是上传的图片数组、最大宽度、最大高度、压缩比例以及压缩完成后的回调函数。具体的压缩过程与之前的示例类似,不再赘述。最后,我们将压缩结果放入compressed_images数组中,并在所有图片压缩完成后回调传入的回调函数。

示例代码

var input = document.getElementById('image_upload');
input.addEventListener('change', function() {
  var files = input.files
  var images = []
​
  for (var i = 0; i < files.length; i++) {
    var file = files[i]
    if (file.type.indexOf('image') !== -1) {
      images.push(file)
    }
  }
​
  compressImages(images, 800, 800, 0.8, function(compressed_images) {
    console.log(compressed_images)
  })
})

在示例代码中,我们通过addEventListener监听文件上传事件,获取用户上传的图片文件。我们使用上述封装的compressImages函数压缩图片,并将压缩结果输出到控制台。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:canvas压缩图片转换成base64格式输出文件流 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 详解JavaScript 浮点数运算的精度问题

    详解JavaScript 浮点数运算的精度问题 JavaScript 中的浮点数运算经常会出现精度问题,这是因为计算机存储小数时采用的是二进制,而在二进制表示下并不能精确地表示所有的十进制小数。 浮点数存储机制 JavaScript 中的浮点数采用 IEEE 754 标准,用 64 位二进制数表示,其中第 0 位表示符号位,第 1 至 11 位表示指数,第 …

    JavaScript 2023年5月28日
    00
  • 如何开发一个渐进式Web应用程序PWA

    如何开发一个渐进式Web应用程序(PWA)的完整攻略主要包含以下步骤: 1. 确定应用程序的功能 在开发PWA之前,我们需要明确我们的应用程序所需要实现的功能。这样有助于我们更好地明确开发的方向和目标。 2. 设计您的应用程序的用户界面 设计好应用程序的用户界面是非常重要的。因为它直接影响用户对您的应用程序的使用体验。 3. 选择合适的PWA框架 目前,有许…

    JavaScript 2023年6月11日
    00
  • JS中parseInt()和map()用法分析

    JS中parseInt()和map()用法分析 parseInt() parseInt()是一个全局函数,用于解析字符串并返回整数。该函数接受两个参数:要解析的字符串和一个表示解析进制的参数。 parseInt(string, radix) 其中,string是要转换的字符串,radix是一个可选参数,表示要解析的字符串的进制数。 如果省略radix参数,则…

    JavaScript 2023年5月28日
    00
  • JS实现字符串转日期并比较大小实例分析

    当我们需要比较两个日期的大小时,通常需要将字符串类型的日期转换为JavaScript中的Date对象,然后使用比较运算符进行比较。下面是JS实现字符串转日期并比较大小的完整攻略。 1. 将字符串类型的日期转换为Date对象 可以使用Date对象的构造函数并传入字符串类型的日期来创建一个Date对象。 var dateString = "2022-0…

    JavaScript 2023年5月27日
    00
  • 帮你提高开发效率的JavaScript20个技巧

    帮你提高开发效率的JavaScript 20个技巧攻略 1. 使用模板字面量 模板字面量是ES6新特性中之一,它使用反引号 ` 来包裹字符串模板,可以非常方便地插入变量、表达式、换行符及其它一些字符。使用模板字面量可以更加优雅简洁地构建字符串,提高开发效率。 例如,使用模板字面量来生成HTML代码: const div = ` <div class=&…

    JavaScript 2023年5月18日
    00
  • js使用正则实现ReplaceAll全部替换的方法

    下面是使用正则实现 ReplaceAll 全部替换的方法的攻略。 什么是 ReplaceAll ReplaceAll 是指使用一定规则,将一个字符串中所有匹配到的子字符串全部替换为新的字符串,而不仅仅是替换第一个匹配到的子字符串。 实现 ReplaceAll 的方法 JavaScript 自带的 replace() 方法只会替换首个匹配到的子串,无法实现 R…

    JavaScript 2023年6月10日
    00
  • Javascript柯里化实现原理及作用解析

    Javascript柯里化实现原理及作用解析 什么是柯里化? 柯里化(Currying)是一种函数式编程技巧,它是指将接受多个参数的函数转变为接受单一参数的函数,并且返回一个新函数来处理剩余的参数。 举个例子,将如下的函数: function add(x, y, z) { return x + y + z; } 转变为柯里化的形式: function add…

    JavaScript 2023年6月11日
    00
  • JavaScript 定时器详情

    JavaScript 定时器详情 JavaScript 定时器是一种可以按照指定时间间隔循环执行代码的机制。它可以使得开发者对页面进行自动化控制,从而使得网站的交互更加丰富和动态。 JavaScript 定时器包括两种类型:setInterval() 和 setTimeout()。setInterval() 方法会按照指定的时间间隔重复执行一段代码,而 se…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部