5

Web サービスへの AJAX 要求を使用して、16 ビット整数の大きな配列をクライアントに転送する必要があります。この配列は、基本的に、追加のメタ データを含む画像のグレースケール ピクセル データです。

元の画像は、ブラウザでサポートされていない独自の形式です。典型的な画像は 2000px x 4000px であるため、配列には 8,000,000+ 16 ビット値を含めることができます。

1 つの AJAX リクエストを作成し、この配列全体を 1 つのレスポンスで返すことは許容されますか?それとも、小さなチャンクに分割して、それぞれを個別にリクエストする必要がありますか? 配列全体を 1 回の応答で転送することが受け入れられている場合、要求中に信頼できない接続を処理する必要がありますか (または、ブラウザーで「すぐに」使用できますか)?

私たちはクライアントと Web サービスの両方を書いているので、私たちのアプローチは完全に柔軟です。

4

2 に答える 2

1

他の人が述べたように、サーバーで gzip 圧縮転送を有効にすると、ブラウザは画像を自動的に解凍するはずです。画像が同じ色の広い領域を持つスキャンされたドキュメントである場合、実際には画像がかなり圧縮される可能性があります。航空写真のようなものであれば、それほど多くはありません。

クライアント側にイメージがあるので、もう 1 つの問題があります。800 万個の 16 ビット ピクセルをどうするかです。

配列を型付けする前に、文字列を使用して任意のデータを表す必要がありました。JavaScript では文字列は 16 ビット コード単位のシーケンスであり、UTF-16 でエンコードされたテキストとして解釈される可能性があるため、これは思ったより安全です。JavaScript は、無効なエンコーディングの文字列に対してまったく問題ありません。

これは、画像を 1 つの長い文字列として保存し、 を使用して個々のピクセルにアクセスできることを意味しますcharCodeAt。これは、ほとんどの操作目的でかなり高速です。

16 ビットのバイナリ データ (実際には PNG アイコン) を文字列に読み込み、最初の 16 要素を出力する例を次に示します。

$.ajax({
    url:"http://fiddle.jshell.net/favicon.png",
    success: function(data) {
        // Now we have the data, let's show it:
        var out = "";
        for (var i = 0; i < 16; i++) {
            out += ","+data.charCodeAt(i).toString(16);
        }
        console.log(out.substring(1));
    },
    beforeSend: function ( xhr ) {
        xhr.overrideMimeType("text/plain; charset=utf-16be");
    },
    error: function(jqXHR, textStatus, errorThrown) {
        console.log("ERROR: "+textStatus+" "+errorThrown);
        console.log(jqXHR);
    },
})

( jsfiddleでの実例)

于 2013-03-23T19:12:28.667 に答える
0

転送する必要があるデータのサイズは 16 MB を超えていますが、アーカイブされていないデータを扱っているという事実を考えると、gzip を使用してサイズを小さくする必要があります。また、非常に高速なシリアル化形式について考える必要があります (データをシリアル化/逆シリアル化するには、クライアントとサーバーの両方で多くの処理が必要になるため)。

于 2013-03-23T10:18:40.063 に答える