ArrayBuffer到blob转换

时间:2017-05-24 02:23:37

标签: javascript djvu

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

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

正如我所说,图书馆已经过时了(最后一次提交是5年前),所以我需要做一些修改。主要问题是lib使用过时的BlobBuilder。

我为解决这个问题所做的步骤:

  1. 通过Chrome DevTools
  2. 解压缩此库
  3. 初始错误位于第3774行var c = "undefined" != typeof MozBlobBuilder ? MozBlobBuilder : "undefined" != typeof WebKitBlobBuilder ? WebKitBlobBuilder : console.log("warning: cannot build blobs")
  4. 我注释掉了这一行
  5. 接下来,我注释了行c = new c;以及以下一些行。
  6. 所以,现在它看起来像这样(变量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处理程序)。

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

2 个答案:

答案 0 :(得分:50)

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

new Blob([new Uint8Array(data)]);

答案 1 :(得分:0)

var buffer = new ArrayBuffer(32);

new Blob([buffer]);

因此Uint8Array应该是

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