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