MDN之Web API 接口参考(六)【 HTMLCanvasElement.toBlob()】

本文介绍如何使用HTMLCanvasElement.toBlob()方法将canvas上的图像导出为各种格式的图片文件,包括PNG、JPEG等,并提供了将canvas图像转换为文件的具体示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HTMLCanvasElement.toBlob() 方法创造Blob对象,用以展示canvas上的图片;这个图片文件可以被缓存或保存到本地,由用户代理端自行决定。如不特别指明,图片的类型默认为 image/png,分辨率为96dpi

第三个参数用于针对image/jpeg格式的图片进行输出图片的质量设置。

语法

void canvas.toBlob(callback, type, encoderOptions);

参数

callback

回调函数,可获得一个单独的Blob对象参数。

type 可选

DOMString类型,指定图片格式,默认格式为image/png

encoderOptions 可选

Number类型,值在0与1之间,当请求图片格式为image/jpeg或者image/webp时用来指定图片展示质量。如果这个参数的值不在指定类型与范围之内,则使用默认值,其余参数将被忽略。

返回值

无。

示例

canvas图像转换为文件

当一个内容画到canvas上时,我们可以将它生成任何一个格式支持的图片文件。比如,下面的代码段获得了id为“canvas”的<canvas>元素中的图像,复制成一个PNG图,在文档中加入一个新的<img>元素,这个<img>元素的源图就是使用canvas创建的那个图像。

var canvas = document.getElementById("canvas");

canvas.toBlob(function(blob) {
  var newImg = document.createElement("img"),
      url = URL.createObjectURL(blob);

  newImg.onload = function() {
    // no longer need to read the blob so it's revoked
    URL.revokeObjectURL(url);
  };

  newImg.src = url;
  document.body.appendChild(newImg);
});

注意,我们这里创建的是PNG图片;如果在toBlob()传入第二个参数,就可以指定图片格式。例如,生成JPEG格式的图片:

canvas.toBlob(function(blob){...}, "image/jpeg", 0.95); // JPEG at 95% quality

canvas转换为ico(仅限Mozilla

使用-moz-parse来将canvas转换为ico。Windows XP不支持将PNG转为ico,因此转为bmp作为代替。设置下载属性,生成下载链接。下载属性的值将被用来作为文件名。

var canvas = document.getElementById("canvas");
var d = canvas.width;
ctx = canvas.getContext("2d");
ctx.beginPath();
ctx.moveTo(d / 2, 0);
ctx.lineTo(d, d);
ctx.lineTo(0, d);
ctx.closePath();
ctx.fillStyle = "yellow";
ctx.fill();

function blobCallback(iconName) {
  return function(b) {
    var a = document.createElement("a");
    a.textContent = "Download";
    document.body.appendChild(a);
    a.style.display = "block";
    a.download = iconName + ".ico";
    a.href = window.URL.createObjectURL(b);
  }
}
canvas.toBlob(blobCallback('passThisString'), 'image/vnd.microsoft.icon', 
              '-moz-parse-options:format=bmp;bpp=32');

Save toBlob to disk with OS.File (chrome/add-on context only

此技术将其保存到桌面,仅在Firefox chrome上下文或附加代码中有用,因为Web站点上不存在OS API

var canvas = document.getElementById("canvas");
var d = canvas.width;
ctx = canvas.getContext("2d");
ctx.beginPath();
ctx.moveTo(d / 2, 0);
ctx.lineTo(d, d);
ctx.lineTo(0, d);
ctx.closePath();
ctx.fillStyle = "yellow";
ctx.fill();

function blobCallback(iconName) {
  return function(b) {
    var r = new FileReader();
    r.onloadend = function () {
    // r.result contains the ArrayBuffer.
    Cu.import('resource://gre/modules/osfile.jsm');
    var writePath = OS.Path.join(OS.Constants.Path.desktopDir, 
                                 iconName + '.ico');
    var promise = OS.File.writeAtomic(writePath, new Uint8Array(r.result), 
                                      {tmpPath:writePath + '.tmp'});
    promise.then(
      function() {
        console.log('successfully wrote file');
      },
      function() {
        console.log('failure writing file')
      }
    );
  };
  r.readAsArrayBuffer(b);
  }
}

canvas.toBlob(blobCallback('passThisString'), 'image/vnd.microsoft.icon',
              '-moz-parse-options:format=bmp;bpp=32');

Polyfill

基于toDataURL的低性能polyfill

if (!HTMLCanvasElement.prototype.toBlob) {
 Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', {
  value: function (callback, type, quality) {

    var binStr = atob( this.toDataURL(type, quality).split(',')[1] ),
        len = binStr.length,
        arr = new Uint8Array(len);

    for (var i=0; i<len; i++ ) {
     arr[i] = binStr.charCodeAt(i);
    }

    callback( new Blob( [arr], {type: type || 'image/png'} ) );
  }
 });
}
要查找与 **Canvas** 相关的文档或使用指南,可以按照以下分类和资源进行查阅: ### 1. HTML5 Canvas 使用文档 对于 Web 开发者来说,HTML5 中的 `<canvas>` 元素提供了强大的绘图能力。可以通过 MDN(Mozilla Developer Network)获取最权威的文档: - [MDN HTMLCanvasElement 文档](https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLCanvasElement) 提供了关于 `canvas` 元素的详细说明。 - [MDN Canvas 教程](https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API/Tutorial) 是一个完整的入门教程,涵盖了从基础绘图到高级动画的内容。 在使用时,通常需要通过 `getContext('2d')` 获取 2D 上下文并进行绘制操作,例如: ```javascript const canvas = document.getElementById('myCanvas'); const ctx = canvas.getContext('2d'); ctx.fillStyle = 'blue'; ctx.fillRect(0, 0, 100, 100); ``` [^1] ### 2. Android 端 OpenGL Canvas 开发指南 如果你正在寻找基于 Android 平台、使用 OpenGL 实现高性能绘图的解决方案,可以参考开源项目:[android-openGL-canvas](https://github.com/ChillingVan/android-openGL-canvas.git)。该项目模仿 Android 原生 `Canvas` 的行为,并提供了一个高效的图形渲染框架。主要结构如下: - `src/main/java/com/chillingvan/canvas`: 核心类如 `GLView` 和 `ICanvasGL` 的实现位置。 - `example`: 示例代码展示如何集成和使用该库进行绘图。 - `build.gradle`: 构建配置文件,定义依赖项和编译设置。 - `README.md`: 包含快速入门说明和基本用法介绍 [^2]。 ### 3. 浏览器端截图工具 html2canvas 如果你想将网页内容转换为图片,并通过 Canvas 进行进一步处理,推荐使用 **html2canvas** 库。其官方文档及示例可参考: - [html2canvas GitHub 页面](https://github.com/niklasvh/html2canvas) - 该库通过异步方式捕获 DOM 元素,并将其渲染到离屏 Canvas 中,最终可通过 `canvas.toDataURL()` 或 `canvas.toBlob()` 输出结果 [^3]。 使用示例: ```javascript html2canvas(document.body).then(canvas => { document.body.appendChild(canvas); }); ``` ### 4. npm 包开发与示例启动 若你计划参与开发类似库或运行本地示例,建议查看项目的 `package.json` 文件中的 `scripts` 配置,并执行 `npm start` 启动演示应用。此外,`example/index.js` 通常是入口文件之一,用于加载和展示组件 [^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值