Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ArrayBuffer到blob的转换_Javascript_Djvu - Fatal编程技术网

Javascript ArrayBuffer到blob的转换

Javascript ArrayBuffer到blob的转换,javascript,djvu,Javascript,Djvu,我有一个项目,我需要在浏览器中显示djvu模式 据我所知,我找到了这个旧文件,它将djvu文件转换为bmp,然后将它们放入canvas元素 正如我所说,这个库很旧(上次提交是5年前),所以我需要做一些更正。主要问题是lib使用了过时的BlobBuilder 我为解决此问题而采取的步骤: 通过Chrome开发工具解压缩此库 初始错误在第3774行var c=“undefined”!=MozBlobBuilder的类型?MozBlobBuilder:“未定义”!=WebKitBlobBuilder的

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

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

正如我所说,这个库很旧(上次提交是5年前),所以我需要做一些更正。主要问题是lib使用了过时的BlobBuilder

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

  • 通过Chrome开发工具解压缩此库
  • 初始错误在第3774行
    var c=“undefined”!=MozBlobBuilder的类型?MozBlobBuilder:“未定义”!=WebKitBlobBuilder的类型?WebKitBlobBuilder:console.log(“警告:无法生成blob”)
  • 我把这行注释掉了
  • 接下来,我注释掉了行
    c=newc和下面的一些行
  • 所以,现在看起来是这样的(变量I是数组缓冲区,而ololo1和ololo2是某种偏移量和限制)

    var c=new Blob(新Uint8Array(新Uint8Array(I,ololo1,ololo2)))
    ,b=b.createObjectURL(c)
    ,c=document.getElementById(kb)
    ,f=c.getContext(“2d”)
    ,h=新图像
    ,g=a[Ea>>2]
    ,i=a[Fa>>2]
    ,j=c.宽度
    ,k=数学圆(i*j/g);
    h、 onload=函数()
    {
    var a=g/j;
    4a&&(a=1);
    f、 globalAlpha=1;
    对于(N=0;N
    现在我遇到了错误“Image/bmp.bmp无法解码!”(在h.onerror处理程序中抛出)


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

    我不知道作者为什么要将他的
    Uint8Array
    包装在一个新的数组中。。。请注意,我对不推荐使用的BlobBuilder API都不太了解,但我在您的代码中看到的一个输入错误是,您需要将TypedArray封装在普通数组中:

    newblob([newuint8array(buffer,byteOffset,length)];
    
    Blob构造函数将a作为第一个参数,然后在此序列中搜索BufferSource、USVString和Blob元素。因此,当您传递一个TypedArray时,它实际上会迭代该TypedArray的所有条目,并将它们视为USVString(从而将它们的数值转换为Blob中的UTF-8字符串)。这很少是您想要的,所以最好始终在此构造函数中传递一个数组

    var buffer = new ArrayBuffer(32);
    
    new Blob([buffer]);
    
    所以Uint8Array应该是

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

    最初的是
    c.append((新的Uint8Array(新的Uint8Array(I,ololo1,ololo2))).buffer)
    。我不明白作者为什么把他的UINT8数组嵌套在一个新数组中。。。您应该可以使用新的
    Blob([newuint8array(I,ololo1,ololo2)])
    @凯伊多:非常感谢,工作很有魅力。你能把它作为一个答案吗?也节省了我的时间(我传入了一个arrayBuffer来处理二进制数据,但需要将其包装为数组)。然而,我认为Uint8Array应该在没有括号的情况下传入,因为它已经是一个数组了,因此不是OP的问题。您需要用括号括住ArrayBuffer。@aa标记否,如果您传递一个Uint8Array,您将把它的所有0~255个值保存为utf8字符串,因为Blob构造函数不会访问它的
    .buffer
    属性,并且它可能是将包含的数据保存为二进制的目的。我明白了,谢谢。似乎将Uint8Array视图所基于的缓冲区或Uint8Array传入,只要其中一个在括号中,这两个都可以工作。Uint8Array是一种浪费。你不需要它。只需
    新建Blob([buffer])
    。ArrayBuffer是字节数组。^它只是一个视图。不确定起点是ArrayBuffer还是其他类型的视图?这可能会使blob生成器在新blob中脱轨(…)
    new Blob([new Uint8Array([1, 2, 3, 4]).buffer]);