ArrayBuffer to blob conversion



我有一个项目,我需要在浏览器中显示 djvu 模式。

我在 Github 上找到了这个旧库,据我所知,它将 djvu 文件转换为 bmp,然后将它们放入 canvas 元素中。

正如我所说,库很旧(最后一次提交是 5 年前(,所以我需要进行一些更正。主要问题是lib使用过时的BlobBuilder。

我为解决这个问题而采取的步骤:

  1. 通过Chrome DevTools解压缩此库
  2. 初始错误在第 3774 行var c = "undefined" != typeof MozBlobBuilder ? MozBlobBuilder : "undefined" != typeof WebKitBlobBuilder ? WebKitBlobBuilder : console.log("warning: cannot build blobs")
  3. 我注释掉了这一行
  4. 接下来,我注释掉了第 c = new c; 行和以下一些行。

所以,现在它看起来像这样(变量 I 是数组缓冲区,ololo1 和 ololo2 是某种偏移量和限制(

var c = new Blob(new Uint8Array(new Uint8Array(I,ololo1,ololo2)))
              , b = b.createObjectURL(c)
              , c = document.getElementById(kb)
              , f = c.getContext("2d")
              , h = new Image
              , g = a[Ea >> 2]
              , i = a[Fa >> 2]
              , j = c.width
              , k = Math.round(i * j / g);
            h.onload = function()
            {
                var a = g / j;
                4 < a && (a = 4);
                1 > a && (a = 1);
                f.globalAlpha = 1;
                for (N = 0; N < a; N++)
                    f.drawImage(h, N, N, g - a + N, i - a + N, 0, 0, j, k),
                    f.globalAlpha *= 1 - 1 / a;
                R(h.complete, "Image /bmp.bmp could not be decoded")
            }
            ;
            h.onerror = function(errorMsg, url, lineNumber, column, errorObj) {
                console.log(errorMsg, url, lineNumber, column, errorObj);
                console.log("Image /bmp.bmp could not be decoded!")
            }           
            ;

现在我卡在错误"图像/bmp.bmp无法解码!(抛出在 h.onerror 处理程序中(。

所以,我的问题是:我做错了什么?

我不知道

为什么作者确实用一个新的Uint8Array包裹起来......请注意,我真的不知道已弃用的 BlobBuilder API,但我可以在您的代码中看到的一个拼写错误是您需要将 TypedArray 包装在普通Array中:

new Blob([new Uint8Array(buffer, byteOffset, length)]);

Blob()构造函数将 blobParts 序列作为第一个参数,然后在此序列中搜索 BufferSourceUSVStrings Blob 元素。因此,当您传递 TypedArray 时,它实际上会遍历此 TypedArray 的所有条目,并将其视为 USVString(从而在 Blob 中将它们的数值转换为 UTF-8 字符串(。这很少是你想要的,所以最好总是在这个构造函数中传递一个Array

请注意,如果您不需要对缓冲区进行切片,则最好直接传递它,而不是使用中间Uint8Array(但仍采用正常Array(:

new Blob([buffer]);
var buffer = new ArrayBuffer(32);
new Blob([buffer]);

所以 Uint8Array 应该是

new Blob([new Uint8Array([1, 2, 3, 4]).buffer]);

最新更新