Canvas drawImage方法实现图片压缩详解

 更新时间:2022年11月18日 09:07:30   作者:zkj  
这篇文章主要为大家介绍了Canvas drawImage方法实现图片压缩详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

图片压缩原理

  • CanvasRenderingContext2D.drawImage() 方法可以从页面 DOM 元素作为图像源来根据坐标和大小重新绘制该图像。
  • HTMLCanvasElement.toDataURL() 和 HTMLCanvasElement.toBlob() 方法支持导出为 base64 字符串或 Blob 对象。

CanvasRenderingContext2D.drawImage()

drawImage(image, dx, dy)
drawImage(image, dx, dy, dWidth, dHeight)
drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight)
  • image
    • 绘制到上下文的元素。允许任何的画布图像源,包括 canvas、img、svg、video 元素和 ImageBitmap 对象等。
  • dx, dy, dWidth, dHeight
    • 这几个属性表示在 canvas 画布上指定一片区域用来放置图片,dx、dy 指定图片左上角在 canvas 上的坐标,dWidth、dHeight 指定图片在 canvas 上绘制的区域宽高。如果没有指定 sx、sy、sWidth、sHeight 这4个参数,则图片会被拉伸或缩放在 canvas 区域内。
  • sx, sy, swidth, sheight
    • 这几个属性是针对图片元素的,表示图片在 canvas 画布上显示的大小和位置。sx、sy 表示图片上作为左上角的坐标,然后往右下角 swidth、sheight 尺寸范围图片作为最终在 canvas 上显示的图片内容。

图片压缩,需要使用的是 CanvasRenderingContext2D.drawImage() 5个参数的语法,即指定图片左上角在 canvas 上的坐标为 0,图片在 canvas 上绘制的区域宽高为 canvas 的宽高即可。例如,图片的原始尺寸是 4000*3000,现在要把尺寸限制为 400*300 大小。

const canvas = document.createElement('canvas');
const context = canvas.getContext('2d');
canvas.width = 400;
canvas.height = 300;
context.drawImage(img,0,0,canvas.width,canvas.height);

如果需要将转换后的图像渲染到页面 DOM 元素,可以使用 HTMLCanvasElement.toDataURL() 方法来获取转换后的图像 base64 格式信息的字符串传递给 img 元素的 src。或使用 HTMLCanvasElement.toBlob() 方法获取 Blob 格式的对象,然后使用 URL.createObjectURL() 获取对象 URL 传递给 img 元素的 src。也可以将该 base64 字符串或 Blob 对象上传到后端服务器。

HTMLCanvasElement.toDataURL()

该方法将图片转换成 base64 格式信息的字符串表示法。

toDataURL()
toDataURL(type)
toDataURL(type, encoderOptions)
  • type 可选
    • 图片格式,默认为 image/png。file 对象中的 file.type 属性可以传到此参数。
  • encoderOptions 可选
    • 在指定图片格式为 image/jpeg 或 image/webp 时,可以从 0 到 1 的区间内选择图片的质量。如果超出取值范围,将会使用默认值 0.92。其他参数会被忽略。

HTMLCanvasElement.toBlob()

  • 比 HTMLCanvasElement.toDataURL() 方法多了一个 callback 参数,其他参数相同。
  • 无返回值。
  • 该方法是异步的,所以需要在 callback 回调方法中处理转换结果,回调参数是转换好的包含 canvas 画布上的图像的 Blob 对象,如果图像未被成功创建,可能会获得 null 值。
toBlob(callback)
toBlob(callback, type)
toBlob(callback, type, quality)

示例

下面原始图片的大小为 84867 字节(大约 83KB),压缩后大小仅为 16354 字节(约 16KB)。

(async function() {
  const {size, type} = await fetch(img.src).then(res=>res.blob());
  result.textContent += JSON.stringify({size, type});
  const canvas = document.createElement('canvas');
  const context = canvas.getContext('2d');
  canvas.width = 400;
  canvas.height = 300;
  context.drawImage(img,0,0,400,300);
  img2.src = canvas.toDataURL(type);
  canvas.toBlob(({size, type}) => result2.textContent += JSON.stringify({size, type}), type);
})()

以上就是Canvas drawImage方法实现图片压缩详解的详细内容,更多关于Canvas drawImage 压缩图片的资料请关注脚本之家其它相关文章!

相关文章

  • JavaScript实现省市联动过程中bug的解决方法

    JavaScript实现省市联动过程中bug的解决方法

    这篇文章主要为大家详细介绍了解决JavaScript实现省市联动过程中的bug,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • js获取元素外链样式的方法

    js获取元素外链样式的方法

    这篇文章主要介绍了js获取元素外链样式的方法,分别在标准浏览器与IE浏览器两种情况下实现获取对应样式的功能,是非常实用的技巧,需要的朋友可以参考下
    2015-01-01
  • JS获得URL超链接的参数值实例代码

    JS获得URL超链接的参数值实例代码

    使用js获取超链接中keyword的参数值,具体实现代码如下,感兴趣的朋友可以参考下哈,希望对大家有所帮助
    2013-06-06
  • Fullpage.js固定导航栏-实现定位导航栏

    Fullpage.js固定导航栏-实现定位导航栏

    FullPage.js 是一个简单而易于使用的插件,用来创建全屏滚动网站(也被称为单页网站)。接下来通过本文给大家介绍Fullpage.js固定导航栏-实现定位导航栏,对fullpage.js导航栏相关知识感兴趣的朋友一起学习吧
    2016-03-03
  • 一文详解JavaScript中this指向的问题

    一文详解JavaScript中this指向的问题

    JavaScript中this指向的问题是面试中常常会问到的,所以本文就来通过一些简单的示例为大家详细讲讲,文中的示例代码讲解详细,需要的可以参考一下
    2023-04-04
  • JavaScript实现放大镜效果代码示例

    JavaScript实现放大镜效果代码示例

    这篇文章主要介绍了JavaScript实现放大镜效果代码示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 浅谈JS中的反柯里化( uncurrying)

    浅谈JS中的反柯里化( uncurrying)

    本篇文章主要介绍了浅谈JS中的反柯里化( uncurrying),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 前端图片压缩常见的一些解决办法

    前端图片压缩常见的一些解决办法

    这篇文章主要给大家介绍了关于前端图片压缩常见的一些解决办法,图片上传是前端中常见的的业务场景,无论是前台还是后台,适当的对图片进行压缩处理,可以显著的提升用户体验,需要的朋友可以参考下
    2023-11-11
  • 通过学习bootstrop导航条学会修改bootstrop颜色基调

    通过学习bootstrop导航条学会修改bootstrop颜色基调

    这篇文章主要介绍了通过学习bootstrop导航条学会修改bootstrop颜色基调,需要的朋友可以参考下
    2017-06-06
  • 你有必要知道的10个JavaScript难点

    你有必要知道的10个JavaScript难点

    10个JavaScript难点,你可能还不知道,不着急,本文为大家一一列出,一一攻破,感兴趣的小伙伴们可以参考一下
    2017-07-07

最新评论