質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

3175閲覧

javaScriptでバイナリデータを画像に変換できない

nobodytolove123

総合スコア61

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

2クリップ

投稿2017/12/05 02:36

###前提・実現したいこと
お世話になります。
現在、Line Messaging APIを利用してLineアプリで送信した画像を
Node.jsでバイナリデータで受け取り、HTMLファイルの画面に受け取ったデータを元に
画像を表示しようと試行錯誤しています。

結果、Node.jsでデータは下記のように受け取れました。

<Buffer ff d8 ff e0 00 10 4a 46 49 46 00 01 01 00 00 48 00 48 00 00 ff e1 00 4c 45 78 69 66 00 00 4d 4d 00 2a 00 00 00 08 00 02 01 12 00 03 00 00 00 01 00 01 ... >

JSONに変換し配列を文字列に変換してHTMLでは下記のように受け取りました。

2552162552240167470737001100720720025522507669120105102007777042000802118030001010013 ...

しかしこのデータを画像に変換できません。
img要素のsrc属性にDataURL化した文字列を代入しても表示されませんでした。

###該当のソースコード

js

1// ejsでJSON文字列されたバイナリデータが入っている。 2<%= content %> 3 </div> 4 <script> 5 // バイナリ文字列(記号) 6 var doc = document.getElementById('binary'); 7 // バイナリ配列 8 var json = JSON.parse(doc.innerHTML); 9 var string = ""; 10 var toDataURL = ""; 11 // バイナリ文字列 12 for (var i = 0; i < json.data.length; i++) { 13 string += String(json.data[i]).toString(16); 14 } 15 16 var base64 = btoa(binary_file); 17 // DataURL化された文字列 18 var DataURL = 'data:image/jpeg;base64,' + base64; 19 </script>

###試したこと

試したことは上記ですべてです。
試行錯誤ですので、自分自身でもなにをすれば良いのか分かりませんでした。

どうかお知恵をお貸しください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

defghi1977

2017/12/05 02:46

JSON化で死んでる. ”Buffer”で空白区切りでバイト列を表しているんだから, それを連結したらわけわからんようになるよ
nobodytolove123

2017/12/05 02:51

ご回答ありがとうございます!なるほど、JSON変換したらおかしくなるんですね。
nobodytolove123

2017/12/05 02:52

ちなみにもとのBufferデータをどうすれば画像に変換できますか?
defghi1977

2017/12/05 02:55

せっかく「ff d8 ff e0」でJPEGと判る内容を10進変換して連結したから「255216255224」という意味不明な数値になっています. ここは素直にHTML側に”Buffer”の列をスルーして, 空白文字でsplitしてArray.mapでparseInt(str, 16)してUint8Array作ってBlob作ってURL.createObjectURLで, ハイ出来上がり
guest

回答2

0

普通にサーバー側でbase64エンコードしたデータを発行してもらって
テキストとして受け渡せばいいのでは?

投稿2017/12/05 02:51

yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nobodytolove123

2017/12/05 02:53

ご回答ありがとうございます!早速やってみます。 そのテキストデータをimg.src = base64とすれば表示できますか?
guest

0

ベストアンサー

無理にJSON化などせず, そのまま画像データをHTMLに渡すのが良かろうと思います.
例えばHTMLに"Buffer"文字列が直接渡されたものとすれば次のようになりましょう.

JavaScript

1//元々のJPEGデータ文字列 2const bin = "ff d8 ff e0 00 10 4a 46 49 46 00 01 01 00 00・・・"; 3//区切り文字で配列に分割 4const strs = bin.split(" "); 5//文字列の配列を数値の配列に変換 6const arr = strs.map(str => parseInt(str, 16)); 7//数値の配列を型付き配列に変換 8const typedArr = new Uint8Array(arr); 9//型付き配列内のJPEGデータを元にBlob(≒ファイル)を生成 10const blob = new Blob([arr], {type: "image/jpeg"}); 11//Blob画像をimg要素に読み込み可能とするためにURL化する 12const url = URL.createObjectURL(blob); 13//生成したURLをimg要素に設定する 14image.src = url; 15

通信効率等を踏まえるのであれば, この流れを壊さないようにNode側とHTML側とで処理を分割します.

投稿2017/12/05 03:09

defghi1977

総合スコア4756

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nobodytolove123

2017/12/05 03:54

ご回答ありがとうございます、ソースまで。。。ありがとうございます!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問