将ImageBitmap转换为Blob

时间:2018-10-24 01:19:41

标签: javascript image html5-canvas

我正在使用createImageBitmap()创建一个ImageBitmap文件。

如何将该文件转换为Blob或理想的PNG,以便可以上传?

1 个答案:

答案 0 :(得分:2)

当前唯一的方法是将其绘制在画布上。

为获得更高的效率,您可以尝试使用ImageBitmapRenderingContext,它将再次复制像素缓冲区。

  

有关使用bitmaprenderer的重要提示
  虽然确实是最佳做法,但Chrome currently has a bug会使输出图像透明,从而迫使我们改用2d上下文。
  我希望使用bitmaprenderer上下文保留代码,但希望此错误能尽快得到解决,但这意味着以下代码段暂时仅适用于FF。

fetch('https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png')
  .then(r => r.blob()) // yes.. from a Blob to a Blob...
// ImageBitmap generation  
  .then(createImageBitmap)
// to Blob
  .then(img => {
    console.log(img); // ImageBitmap
    return new Promise(res => {
      // create a canvas
      const canvas = document.createElement('canvas');
      // resize it to the size of our ImageBitmap
      canvas.width = img.width;
      canvas.height = img.height;
      // try to get a bitmaprenderer context
      let ctx = canvas.getContext('bitmaprenderer');
      if(ctx) {
        // transfer the ImageBitmap to it
        ctx.transferFromImageBitmap(img);
      }
      else {
        // in case someone supports createImageBitmap only
        // twice in memory...
        canvas.getContext('2d').drawImage(img,0,0);
      }
      // get it back as a Blob
      canvas.toBlob(res);
    });
  })
  .then(blob => {
    console.log(blob); // Blob
    var img = document.body.appendChild(new Image());
    img.src = URL.createObjectURL(blob);
  });

检查HTMLCanvasElement#toBlob()中可以传递的选项(适用时文件格式和质量)。