0

Intel XDK で HTML5 アプリを作成しているため、計算は Javascript で行われます。

ケース: サーバーから (google) protobuf メッセージを取得する。それを解析してオブジェクトにします。jpg という画像があります。それをHTMLに入れます。ねえ、そのためにbase64を使用できます... Androidでこれを行いました。BitmapFactory を使用できます。

Bitmap bitmap = android.graphics.BitmapFactory.decodeStream(document.getDocBlob().newInput());

いくつかのgoogle-fuが次のようなものを見つけた後:

var base64String = btoa(String.fromCharCode.apply(null, new Uint8Array(currentComment.Document.doc_blob.buffer)));

var ByteBuffer = ProtoBuf.ByteBuffer;
var base64String = ByteBuffer.btoa(currentComment.Document.doc_blob.buffer, currentComment.Document.doc_blob.littleEndian, currentComment.Document.doc_blob.noAssert);

ここに問題があります:画像が表示されません: リンク切れの画像が表示されます。ただし、上記の最初の関数を使用してもエラーは発生しません。私が間違っていると思うのは、オフセットです。データ構造は次のようになります。

buffer: ArrayBuffer
  byteLength: 148199
  __proto__: ArrayBuffer
limit: 69895
littleEndian: true
markedOffset: -1
noAssert: false
offset: 44278
view: DataView

HTML への設定は次のように行われ、動作します。他の base64 文字列でテストしました。

commentImage = document.getElementById("img-frame"); 
var source = "data:image/" + image_type + ";base64," + base64String;

commentImage.setAttribute("height", currentComment.Document.doc_height);
commentImage.setAttribute("width", currentComment.Document.doc_width);
commentImage.setAttribute("src", source);
4

1 に答える 1

0

ブロブはブロブ全体であり、画像の開始点と終了点があります。

オプション A: 通常の btoa() - 高速

var base64StringA =  btoa(String.fromCharCode.apply(null, new Uint8Array(currentComment.Document.doc_blob.buffer.slice(currentComment.Document.doc_blob.offset,currentComment.Document.doc_blob.limit))));

オプション B: Bytebuffer.btoa() - 少し遅い (ただし、btoa() がウィンドウでどのように定義されているかに依存しないため、これはより安全なオプションだと思います。使用するブラウザーに依存します...)

var base64StringB = ByteBuffer.btoa(String.fromCharCode.apply(null, new Uint8Array(currentComment.Document.doc_blob.buffer.slice(currentComment.Document.doc_blob.offset, currentComment.Document.doc_blob.limit))), currentComment.Document.doc_blob.littleEndian, currentComment.Document.doc_blob.noAssert);
于 2016-06-22T15:20:07.063 に答える