HTMLCanvasElement: toBlob() 方法
HTMLCanvasElement.toBlob()
方法创建一个表示画布中包含的图像的 Blob
对象。此文件可能会根据用户代理的决定缓存在磁盘上或存储在内存中。
可以指定所需的文 件格式和图像质量。如果未指定文件格式,或给定的格式不受支持,则数据将以 image/png
格式导出。浏览器需要支持 image/png
;许多浏览器还支持其他格式,包括 image/jpeg
和 image/webp
。
对于支持编码分辨率元数据的文件格式,创建的图像将具有 96dpi 的分辨率。
语法
js
toBlob(callback)
toBlob(callback, type)
toBlob(callback, type, quality)
参数
返回值
无 (undefined
)。
异常
SecurityError
-
画布的位图不是源清晰的;其至少部分内容已加载或可能已加载自文档本身加载的站点以外的站点。
示例
获取表示画布的文件
将内容绘制到画布中后,您可以将其转换为任何受支持的图像格式的文件。例如,下面的代码片段获取 ID 为“canvas”的 <canvas>
元素中的图像,获取其 PNG 图像副本,然后将一个新的 <img>
元素附加到文档中,其源图像为使用画布创建的图像。
js
const canvas = document.getElementById("canvas");
canvas.toBlob((blob) => {
const newImg = document.createElement("img");
const url = URL.createObjectURL(blob);
newImg.onload = () => {
// no longer need to read the blob so it's revoked
URL.revokeObjectURL(url);
};
newImg.src = url;
document.body.appendChild(newImg);
});
请注意,这里我们创建的是 PNG 图像;如果向 toBlob()
调用添加第二个参数,则可以指定用户代理支持的其他图像类型。例如,要获取 JPEG 格式的图像
js
canvas.toBlob(
(blob) => {
/* … */
},
"image/jpeg",
0.95,
); // JPEG at 95% quality
将画布转换为 ico(仅限 Mozilla)
这使用 -moz-parse
将画布转换为 ico,因此仅在 Firefox 上有效。Windows XP 不支持从 PNG 转换为 ico,因此它使用 bmp。通过设置 download 属性创建下载链接。download 属性的值是它将用作文件名。
js
const canvas = document.getElementById("canvas");
const d = canvas.width;
const 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 (b) => {
const 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",
);
使用 OS.File 将 toBlob 保存到磁盘(仅限 Chrome/附加组件上下文)
注意:此技术将其保存到桌面,并且仅在 Firefox chrome 上下文或附加组件代码中才有用,因为网站上不存在 OS API。
js
const canvas = document.getElementById("canvas");
const 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 (b) => {
const r = new FileReader();
r.onloadend = () => {
// r.result contains the ArrayBuffer.
Cu.import("resource://gre/modules/osfile.jsm");
const writePath = OS.Path.join(
OS.Constants.Path.desktopDir,
`${iconName}.ico`,
);
const promise = OS.File.writeAtomic(writePath, new Uint8Array(r.result), {
tmpPath: `${writePath}.tmp`,
});
promise.then(
() => {
console.log("successfully wrote file");
},
() => {
console.log("failure writing file");
},
);
};
r.readAsArrayBuffer(b);
};
}
canvas.toBlob(
blobCallback("passThisString"),
"image/vnd.microsoft.icon",
"-moz-parse-options:format=bmp;bpp=32",
);
规范
规范 |
---|
HTML 标准 # dom-canvas-toblob-dev |
浏览器兼容性
BCD 表仅在启用 JavaScript 的浏览器中加载。