Canvas 绘制位图图像 ImageBitmap
在 Canvas 图像来源 CanvasImageSource 章节中我们有提到可以使用 ImageBitmap
作为 drawImage()
的图像来源
ImageBitmap
ImageBitmap
是什么呢?
ImageBitmap
是一个高性能的位图,可以低延迟地绘制,它可以从前几章节中学到的所有源以及其它几种源中生成
什么意思呢?
也就是说,ImageBitmap
可以从一张图片,比如 png
,jpg
,gif
中生成,也可以从 <img>
,<canvas>
,<video>
中生成
简直就是 海纳百川,有容波大 啊
那它到底是怎么生成的呢?
ImageBitmap
使用 createImageBitmap()
工厂方法模式,从多种源中生成
createImageBitmap() 方法
createImageBitmap()
方法是 window
对象的一个方法
不过这个方法很坑,很多浏览器不支持
Yes | 不支持 | 49+ | 不支持 | 基本属性 |
createImageBitmap
接受各种不同的图像来源, 并返回一个 Promise
,
语法
createImageBitmap(image[, options]).then(function(response) { ... }); createImageBitmap(image, sx, sy, sw, sh[, options]).then(function(response) { ... });
参数 | 说明 |
---|---|
image | 一个图像源 |
sx | 裁剪点 x 坐标 |
sy | 裁剪点 y 坐标 |
sw | 裁剪宽度,值可为负数 |
sh | 裁剪高度,值可为负数 |
options | 可选,一个字典,由于设置各种选项 |
image 参数
image 参数是一个图像源,可以是以下资源
<img> SVG <image> <video> <canvas> HTMLImageElement SVGImageElement HTMLVideoElement HTMLCanvasElement Blob ImageData ImageBitmap OffscreenCanvas
几乎囊括了所有可绘制对象
option 参数
可选,一个字典,由于设置各种选项,可用的选项有
选项 | 说明 |
---|---|
imageOrientation | 指示图像是按原样呈现还是垂直翻转,可选的值有: none (默认,不翻转) flipY |
premultiplyAlpha | 指示位图颜色通道由 alpha 通道预乘,可选的值有 none premultiply default (默认) |
colorSpaceConversion | 指示图像是否使用色彩空间转换进行解码 none default (默认) |
resizeWidth | 缩放到新的宽度 |
resizeHeight | 缩放到新的高度 |
resizeQuality | 指定图像缩放压缩质量,可选的值有 pixelated low (默认) medium high |
返回值
返回一个 Promise
,参数 resolve
为一个 ImageBitmap 对象
ImageBitmap 属性和方法
ImageBitmap
具有以下属性和方法
属性 | 说明 |
---|---|
height | 只读,正整数,以 px 为单位的图像高度 |
width | 只读,正整数,以 px 为单位的图像的宽度 |
方法 | 说明 |
---|---|
close() | 释放 ImageBitmap 所相关联的所有图形资源 |
范例
我们先准备一张图片,比如 https://www.twle.cn/static/i/meimei_160x160.png
我们先使用 createImageBitmap()
方法裁剪出图片 (10,10)
开始的 100x100
大小的部分
然后使用 drawImage(bitmap)
绘制到画布 (50,50)
的位置上
<!DOCTYPE html> <meta charset="utf-8"> <canvas id="canvas-1" width="400" height="300"> </canvas> <script> var c = document.getElementById("canvas-1"); var ctx = c.getContext("2d"); image = new Image(); image.onload = function() { Promise.all([ createImageBitmap(this, 10, 10, 100, 100), ]).then(function(sprites) { ctx.drawImage(sprites[0], 50, 50,sprites[0].width,sprites[0].height); }); } image.src = 'https://www.twle.cn/static/i/meimei_160x160.png'; </script>
运行效果如下