ArrayBuffer到blob转换

Rul*_*isp 20 javascript djvu

我有一个项目,我需要在浏览器中显示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!")
            }           
            ;
Run Code Online (Sandbox Code Playgroud)

现在我坚持错误"图像/bmp.bmp无法解码!"(扔进了h.onerror处理程序).

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

Kai*_*ido 61

我不知道为什么作者确实把他换成了Uint8Array新的,可能是为了创建一个缓冲区的副本...请注意,我不知道弃用的BlobBuilder API,但是我可以在你的代码中看到一个拼写错误是你需要将TypedArray包装在一个普通的数组中:

new Blob([new Uint8Array(buffer, byteOffset, length)]);
Run Code Online (Sandbox Code Playgroud)

  • Uint8Array是一种浪费.你不需要它.只是`new Blob([buffer])`.ArrayBuffer是一个字节数组. (7认同)
  • 也节省了我的一天(我传入了一个 arrayBuffer 来处理二进制数据,但需要将其包装为 Array)。但是,我认为 Uint8Array 应该在没有括号的情况下传入,因为它已经是一个数组,因此不是 OP 的问题。您需要 ArrayBuffer 周围的括号。 (3认同)
  • @aamarks 不,如果你传递一个 Uint8Array,你将把它的所有 0~255 值保存为 utf8 字符串,因为 Blob 构造函数不会访问它的 `.buffer` 属性,并且它可能是将包含的数据保存为二进制。 (2认同)

xsi*_*n T 26

var buffer = new ArrayBuffer(32);

new Blob([buffer]);
Run Code Online (Sandbox Code Playgroud)

所以 Uint8Array 应该是

new Blob([new Uint8Array([1, 2, 3, 4]).buffer]);
Run Code Online (Sandbox Code Playgroud)