web-dev-qa-db-ja.com

ArrayBufferからBLOBへの変換

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!")
            }           
            ;

そして今、「Image /bmp.bmpをデコードできませんでした!」(h.onerrorハンドラーでスローされました)というエラーで止まりました。

だから、私の質問は:私が間違っていることは何ですか?

17
Rulisp

作者がUint8Arrayを新しいものにラップした理由がわかりません...廃止されたBlobBuilder APIのどちらも本当に知らないことに注意してください。 TypedArrayを通常の配列にラップするには:

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

Blobコンストラクターは、最初のパラメーターとして blobPartsシーケンス を受け取り、BufferSourceUSVStringsおよびこのシーケンスのBlob要素。したがって、TypedArrayを渡すと、実際にはこのTypedArrayのすべてのエントリを反復処理し、これらをUSVString(したがって、数値をBlobのUTF-8文字列に変換します)。それがあなたの望むものになることはめったにないので、常にこのコンストラクタでArrayを渡す方が良いです。

57
Kaiido
var buffer = new ArrayBuffer(32);

new Blob([buffer]);

したがって、Uint8Arrayは

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