canvas性能-绘制图片

canvas绘制图片

一般我们绘制图片会用到的方法是drawImageputImageData,还有作为测试环境使用的createPattern

drawImage

描述:

使用方式:

ctx.drawImage(image,sx,sy,swidth,sheight,x,y,width,height)
  • image的类型:

    • HTMLImageElement:这些图片是由Image()函数构造出来的,或者任何的img元素
    • HTMLVideoElement:用一个HTML的video元素作为你的图片源,可以从视频中抓取当前帧作为一个图像
    • HTMLCanvasElement:可以使用另一个canvas元素作为你的图片源
    • ImageBitmap:这是一个高性能的位图,可以低延迟地绘制,它可以从上述的所有源以及其它几种源中生成
  • sx:可选。开始剪切的 x 坐标位置
  • sy:可选。开始剪切的 y 坐标位置
  • swidth:可选。被剪切图像的宽度
  • sheight:可选。被剪切图像的高度
  • x:在画布上放置图像的 x 坐标位置
  • y:在画布上放置图像的 y 坐标位置
  • width:可选。要使用的图像的宽度。(伸展或缩小图像)
  • height:可选。要使用的图像的高度。(伸展或缩小图像)

putImageData

描述: Canvas 2D API 将数据从已有的 ImageData 对象绘制到位图的方法。 如果提供了一个绘制过的矩形,则只绘制该矩形的像素。此方法不受画布转换矩阵的影响。

使用方式:

ctx.putImageData(imageData, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight)
  • ImageData:包含像素值的数组对象
  • dx:源图像数据在目标画布中的位置偏移量(x 轴方向的偏移量)
  • dy:源图像数据在目标画布中的位置偏移量(y 轴方向的偏移量)
  • dirtyX:可选 在源图像数据中,矩形区域左上角的位置。默认是整个图像数据的左上角(x 坐标)
  • dirtyY:可选 在源图像数据中,矩形区域左上角的位置。默认是整个图像数据的左上角(y 坐标)
  • dirtyWidth:可选 在源图像数据中,矩形区域的宽度。默认是图像数据的宽度
  • dirtyHeight:可选 在源图像数据中,矩形区域的高度。默认是图像数据的高度。

createPattern

描述:指定的方向内重复指定的元素,元素可以是图片、视频,或者其他 canvas 元素,被重复的元素可用于绘制/填充矩形、圆形或线条等等。

使用方式:

ctx.fillStyle = ctx.createPattern(img,"repeat")
ctx.fill();

测试绘制耗时

测试图片尺寸为(500x500)和(1920x1080)的jpg图片

drawImage

首先测试的是drawImage方法,通过绘制同一张图片不同的资源类型下的耗时

Image类型

  • 在空白canvas情况下渲染该图片耗时:0.01ms左右
  • 在使用了createPattern填充了canvas作为背景的情况下渲染该图片耗时:0.01ms左右

ImageBitmap类型

  • 在空白canvas情况下渲染该图片耗时:1ms左右,(1920*1080)是1.8ms左右
  • 在使用了createPattern填充了canvas作为背景的情况下渲染该图片耗时:0.01ms左右,(1920*1080)是2ms左右

HTMLCanvasElement类型

  • 在空白canvas情况下渲染该图片耗时:0.01ms左右
  • 在使用了createPattern填充了canvas作为背景的情况下渲染该图片耗时:12ms左右,(1920*1080)是14ms左右

putImageData

  • 在空白canvas情况下渲染该图片耗时:1ms左右
  • 在使用了createPattern填充了canvas作为背景的情况下渲染该图片耗时:2ms左右
渲染图片方式 空白canvas下渲染耗时 图片尺寸(500*500) 使用createPattern铺满下渲染耗时 图片尺寸(500*500) 空白canvas下渲染耗时 图片尺寸(1920*1080) 使用createPattern铺满下渲染耗时 图片尺寸(1920*1080)
drawImage(Image) 0.01ms 0.01ms 0.01ms 0.01ms
drawImage(ImageBitmap) 0.01ms 0.01ms 0.01ms 0.01ms
drawImage(HTMLCanvasElement) 0.01ms 12ms 0.01ms 14ms
putImageData 1ms 2ms 1.8ms 3ms

结论

  1. 由上面的测试结果可以看出在空白canvas下渲染图片,除了putImageData剩下的性能是一致的即Image = ImageBitmap = HTMLCanvasElement > putImageData。
  2. 而使用了createPattern平铺作为背景的情况下Image = ImageBitmap > putImageData > HTMLCanvasElement
  3. 渲染图片尺寸大小一般情况下对drawImage(Image)和drawImage(ImageBitmap)的影响较小,而且性能优越。
  4. createPattern铺满的情况下drawImage(HTMLCanvasElement)的性能最差和drawImage(Image)能达到3个数量级的差距
  5. drawImage(HTMLCanvasElement)在空白canvas下性能也很优越
  6. putImageData的性能处于中等,使用createPattern铺满背景的情况下会有一定影响,不过不是太大

所以可以不使用使用createPattern铺满背景的情况下尽量不要使用,可以使用多层canvas,不必要的层级可以减少重绘。或者将平铺的背景转为Image对象使用。

当然以上的结论为我个人开发时的遇到的问题的总结,如果有误请提出。因为样本数量和图片格式并没有达到太多。

canvas性能-drawImage渲染图片的更多相关文章

  1. canvas代替img渲染图片

    移动端用canvas代替img渲染图片,可以提高性能 var oImg = new Image(); oImg.src = url; oImg.onload = function(){ var cvs ...

  2. Canvas中 drawImage绘制图片不显示

    在学习 html5中的 Canvas.drawImage时写了如下代码: <!doctype html> <html> <head><title>研究& ...

  3. 软件项目技术点(8)—— canvas调用drawImage绘制图片

    AxeSlide软件项目梳理   canvas绘图系列知识点整理 html5中标签canvas,函数drawImage(): 使用drawImage()方法绘制图像.绘图环境提供了该方法的三个不同版本 ...

  4. Canvas 中drawImage 绘制不出图片

    在使用Canvas的drawImage绘制图片时,却发现绘制不出图片,原因是图片是异步加载,图片加载完再绘制. //html <img src="1.png" /> & ...

  5. 提高HTML5 canvas性能的几种方法

    简介 HTML5 canvas 最初起源于苹果(Apple)的一项实验,现在已经成为了web中受到广泛支持的2D快速模式绘图(2Dimmediate mode graphic)的标准.许多开发者现在利 ...

  6. 小程序Canvas性能优化实战

    以下内容转载自totoro的文章<小程序Canvas性能优化实战!> 作者:totoro 链接:https://blog.totoroxiao.com/canvas-perf-mini/ ...

  7. iOS给图片添加滤镜&使用openGLES动态渲染图片

    给图片增加滤镜有这两种方式: CoreImage / openGLES 下面先说明如何使用CoreImage给图片添加滤镜, 主要为以下步骤: #1.导入CIImage格式的原始图片 #2.创建CIF ...

  8. React Canvas:高性能渲染 React 组

    React Canvas 提供了使用 Canvas 渲染移动 Web App 界面的能力,替代传统的 DOM 渲染,具有更接近 Native App 的使用体验.React Canvas 提供了一组标 ...

  9. Android 性能优化——之图片的优化

    Android 性能优化——之图片的优化 在Android性能优化中,我们会发现占内存最大的和对性能影响最大的往往是图片资源,其次是控件资源.相对来说,其他的资源的影响会小一点.这里我就先对图片资源的 ...

随机推荐

  1. RabbitMQException com.rabbitmq.client.ShutdownSignalException: connection error; protocol meth

    异常1 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ...

  2. Spring Cloud 入门教程(二): 服务消费者(rest+ribbon)

    在上一篇文章,讲了服务的注册和发现.在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring cloud有两种服务调用方式,一种是ribbon+r ...

  3. Spring Boot 2.4版本前后的分组配置变化及对多环境配置结构的影响

    前几天在<Spring Boot 2.4 对多环境配置的支持更改>一文中,给大家讲解了Spring Boot 2.4版本对多环境配置的配置变化.除此之外,还有一些其他配置变化,所以今天我们 ...

  4. 【超详细】MakeDown(Typora)+PicGo+Gitee实现图床

    [超详细]MakeDown(Typora)+PicGo+Gitee实现图床 序言:我们有时在用makedown整理笔记时想把自己的笔记上传到博客园,可是发现在上传过程中makedown中的图片显示不出 ...

  5. 如何用Python判断一个文件是否被占用?

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 今天有同学问,用os模块的access()能否判断一个文件是否被占用?直觉上,这是行不通的,因为ac ...

  6. 闭关修炼180天--手写持久层框架(mybatis简易版)

    闭关修炼180天--手写持久层框架(mybatis简易版) 抛砖引玉 首先先看一段传统的JDBC编码的代码实现: //传统的JDBC实现 public static void main(String[ ...

  7. NET 5 收发邮件之 MailKit

    大家都用过SmtpClient来处理发送邮件的操作,不过这个类以及被标记已过时,所以介绍一个微软推荐的库MailKit来处理. MailKit开源地址:https://github.com/jsted ...

  8. [LeetCode]Path Sum系列

    1.二叉树路径求指定和,需要注意的是由于有负数,所以即使发现大于目标值也不能返回false,而且返回true的条件有两个,到叶节点且等于sum,缺一不可 public boolean hasPathS ...

  9. CF Grakn Forces 2020 1408E Avoid Rainbow Cycles(最小生成树)

    1408E Avoid Rainbow Cycles 概述 非常有趣的题目(指解法,不难,但很难想) 非常崇拜300iq,今天想做一套div1时看见了他出的这套题Grakn Forces 2020,就 ...

  10. JAVA静态代理和动态代理理解

    代理 代理是英文 Proxy 翻译过来的.我们在生活中见到过的代理,大概最常见的就是朋友圈中卖面膜的同学了. 她们从厂家拿货,然后在朋友圈中宣传,然后卖给熟人. 按理说,顾客可以直接从厂家购买产品,但 ...