0

JavaScript を使用して BMP をダウンロードし、Internet Explorer で画面にレンダリングする必要があります。まず、はい、これは非常識であることはわかっています。理由については説明しません。セキュリティ上の制約のために img src が機能していないことをしばらく受け入れましょう。ただし、投稿で適切な認証を使用した ajax リクエストは画像を引き戻します。この例では、簡単にするためにすべてのセキュリティをバイパスし、何かをレンダリングできることを証明しています。

私が思いついた最良のアイデアは、ajax を介してストリームをフェッチし、ビットマップをデコードしてから、canvas でレンダリングすることでした。Internet Explorer はもちろん canvas をサポートしていませんが、幸運なことに Google が提供する SVG へのラッパーである excanvas を使用することができます。

私のコード(描画コードは機能しているように見えますが、bmpデコードはそれほどではありません)

http://gist.github.com/614328

BMP 以外の他の画像の将来のサポートは妥当であり、キャンバスがどのように機能するかにより、RGBA でピクセルを描画するのが最も簡単です。Texture2D は基本的に、RGBA バイト配列と描画コードのラッパー クラスです。ByteStream を使用すると、バイト配列を扱うのが少し楽になります。BitmapDecoder には、BGR 形式を描画用の RGBA texture2d に変換するメソッドが含まれています。

途中でバイトが誤って変換されている可能性がありますか、それともデコードロジックに問題がありますか?

参考までに、ウィキペディアからファイル仕様を取得しました。

http://en.wikipedia.org/wiki/BMP_file_format#Bitmap_Information_.28DIB_header.29

BMP が正しく描画されない原因となっているデコード ロジックまたは描画ロジックで何が起こっているのか、何か考えはありますか?

4

3 に答える 3

1

これははるかに簡単な(そしてはるかにパフォーマンスの高い)アプローチです:base64はBMPデータをエンコードし(これはサーバーまたはクライアントのいずれかで実行できます)、データURIを使用してページに埋め込みます:

<script type="text/javascript">
  function fetchBmp() {
    $.get('http://localhost:3168/experimental/imgrender/beta.bmp', function (data) {
      var base64Data = $.base64.encode(data); // *

      $('#my-image').attr('src', 'data:image/bmp;base64,' + base64Data);
    });
  }

  // * Lots of plugins for this, e.g. http://github.com/carlo/jquery-base64
</script>    

<img id="my-image" />

最新のブラウザはすべて、データURI(IE8以降を含む-IE7の回避策が存在する場合)とBMP形式をサポートしています。

casablancaが指摘しているように、Ajaxを介したバイナリデータの読み込みに問題がある可能性があるため、回避策を探すためにグーグルで検索する必要があります。

于 2010-10-07T00:35:58.947 に答える
1

XMLHttpRequest(別名AJAX)は主にテキストコンテンツ用に設計されているため、バイナリデータ(特にヌル文字)が正しく変換されない可能性があります。最初のチェックは、取得したデータのサイズを実際のファイルサイズと比較することです。

少なくともFirefoxでは、ここで説明されているように、バイナリデータを具体的に取得する方法があるようです:バイナリデータの処理。

于 2010-10-07T00:37:19.770 に答える
0

修正は2つのことの組み合わせでした

  1. responseBody の raw バイトを読み取るためのちょっとした VBScript
  2. バイトデータを適切にデコードすると、ウィキペディアの記事が示唆するように各ピクセルはパディングされません。実際には、dwordサイズにパディングされるのは各スキャンラインです。

作業コード:

http://gist.github.com/616240

于 2010-10-08T01:57:19.080 に答える