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. 工具-效率工具-XMIND8破解(99.1.3)

    @ 目录 1.下载 2.修改hosts文件 3.修改配置文件 4.填入序列号 5.破解完成 关于作者 1.下载 1.点击进入官方网站下载 2.下载破解包 网址:点击进入网盘地址 密码:domd 2.修 ...

  2. Python爬虫:爬取喜马拉雅音频数据详解

    前言 喜马拉雅是专业的音频分享平台,汇集了有声小说,有声读物,有声书,FM电台,儿童睡前故事,相声小品,鬼故事等数亿条音频,我最喜欢听民间故事和德云社相声集,你呢? 今天带大家爬取喜马拉雅音频数据,一 ...

  3. VC++安装window8.1系统

    下载VC++软件 解压安装(这个过程一般不会出现问题) 安装完成后,运行VC++会出现不兼容信息,照着一下方法就可以解决了. 将MSDEV.EXE重命名为MSDEV1.EXE.(路径:Common/M ...

  4. 5.自定义view-评分控件RatingBar

    1.效果 2.实现原理 1.根据分数分别画选中的星星.正常的星星 2.onTouchEvent 中获取点击.滑动的位置,修改分数,在通过invalidate() 去重新绘制 核心代码: @Overri ...

  5. shell编程-bash教程入门

    Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的.但是它比Windows下的批处理更强大, ...

  6. 总结JAVA语言的十大特性

    JAVA语言的十大特性 1.简单 Java语言的语法简单明了,容易掌握从,而且Java语言是纯面向对象的语言. Java语言的语法规则和C++类似,从某种意义上来讲,Java原因是由C语言和C++语言 ...

  7. java零基础之---eclipse的使用

    想写一篇关于初学者如何使用工具的博客,作为初学者使用IDE的第一个工具,深受大家喜欢,先写一篇eclipse的,然后再逐步推出idea, vscode 等 1. eclipse的下载及安装 1)百度搜 ...

  8. 企业集群架构-03-NFS

    NFS 目录 NFS NFS基本概述 NFS应用场景 NFS实现原理 NFS总结 NFS服务端安装 环境准备 服务端安装NFS 服务端NFS配置 服务端开机自启 服务端验证配置 NFS客户端挂载卸载 ...

  9. 面试官:Mysql 中主库跑太快,从库追不上怎么整?

    写这篇文章是因为之前有一次删库操作,需要进行批量删除数据,当时没有控制好删除速度,导致产生了主从延迟,出现了一点小事故. 今天我们就来看看为什么会产生主从延迟以及主从延迟如何处理等相关问题. 坐好了, ...

  10. Linux 下挂载新硬盘方法(转)

    1.关闭服务器加上新硬盘   2.启动服务器,以root用户登录   3.查看硬盘信息 #fdisk -l Disk /dev/sda: 42.9 GB, 42949672960 bytes 255  ...