前端开发中有时需要将 canvas 的内容导出成图片文件,例如供 CSS 使用,通常会使用 canvas.toDataURL,兼容性好并且简单。

不过 canvas.toDataURL 显然是非常低效的:首先要将图像编码成 PNG 格式,然后再编码成 Base64,使用时又要解码 Base64 和 PNG,一来一往浪费大量开销,并且超长的 URL 也不美观。当然,使用 canvas.toBlob 倒是可以避免 Base64 转换和超长的 URL,但 PNG 转换仍不可避免,而这是最耗性能的。

既然图片只在本地使用,压缩显然毫无必要,为什么不使用更简单的 BMP 格式?虽然 canvas 并不支持导出 BMP 格式,但主流浏览器都能显示 BMP 图片,而且 BMP 本身也支持透明通道,因此完全可以代替 PNG。

BMP 格式非常简单,只需在像素数据前加个文件头就可以。头结构可参考 https://en.wikipedia.org/wiki/BMP_file_format#Example_2

其中有些字段是可选的,不用设置。也有几个比较重要的:

  • BMP 默认从下往上显示,高度取负可从上往下显示

  • RGBA 掩码的顺序(wiki 文档里是 ARGB 的顺序)

我们让 BMP 的像素布局和 canvas 保持一致,这样可无需对现有数据做任何修改。通过 getImageData() 获取数据,前面加上文件头,即可变成一张 BMP 文件。

演示:https://www.etherdream.com/funnyscript/canvas-to-bmp/

虽然是 BMP 图片,但和 PNG 一样同样支持透明度。

使用这个方案,有时甚至都可以不用 canvas,直接通过算法在内存里画出图像,然后转换成 BMP 进行显示。

最新文章

  1. linux系统下使用流行的版本管理工具 Git
  2. fineui刷新父页面
  3. xdebug所有相关方法函数详解(中文翻译版)
  4. Scalaz(4)- typeclass:标准类型-Equal,Order,Show,Enum
  5. C# RGB和HSB相互转换
  6. Android 用adb pull或push 拷贝手机文件到到电脑上,拷贝手机数据库到电脑上,拷贝电脑数据库到手机上
  7. psp0
  8. 《Java编程那点事儿》读书笔记(六)——异常处理
  9. 独家分享——大牛教你如何学习Web前端开发
  10. JS计算两个日期时间之差之天数不正确
  11. 整合Spring.net到asp.net网站开发中初探
  12. WPF Multi-Touch 开发:高效开发模式
  13. Html的基本元素(Element)
  14. Sybase数据库的连接,JNDI配置,Hibernate配置
  15. 【Spring 核心】高级装配
  16. ssh项目访问路径及url请求书写
  17. form 表单提交返回值问题
  18. easyui 面板title 加东西
  19. CloudFoundry 之 IBMCloud 项目部署java例子
  20. Linux平台上轻松安装与配置Domino

热门文章

  1. Typora快捷键 shortcuts-windows
  2. 直播流媒体ums
  3. FLink迟到数据的处理之三
  4. 宝塔面板部署springboot项目并使用域名访问
  5. haproxy https实现
  6. 介绍回流与重绘(Reflow & Repaint),以及如何进行优化?
  7. 3.6 万颗星!开源 Web 服务器后起之秀,自带免费 HTTPS 开箱即用
  8. Solution -「CF 1119F」Niyaz and Small Degrees
  9. 面向对象—多态、鸭子类型(Day21)
  10. leetcode算法1.两数之和