前提・実現したいこと
JavaScriptでBMP画像のカラーパレットを用いて0と1のみを使った2値画像を作成しようとしています。
しかし、任意のデータを出力しようとすると真っ黒の画像しか出力されなかったため、データ部かヘッダ部か表示側かどの問題なのか切り分けをしたいです。
以下のソースコードでヘッダ部の設定が問題ないか確認していただけますでしょうか。
該当のソースコード
JavaScript(ヘッダ部)
1let width = 320 2let height = 240 3let headSize = 54 //ヘッダ部(パレットデータを除く)のサイズ 4let paletteSize = 8 //カラーパレットのサイズ 5let pixelSize = width * height /8 6//データ部のサイズ、1画素が1bitのため1byteで割る 7let HeadBuf = new DataView(new ArrayBuffer(headSize + paletteSize)) 8 9//ファイルヘッダ 10HeadBuf.setUint8(0x0, "BM".charCodeAt(0)) 11HeadBuf.setUint8(1, "BM".charCodeAt(1)); 12HeadBuf.setUint32(2, headSize + pixelSize + paletteSize, true) 13HeadBuf.setUint16(6, 0, true) 14HeadBuf.setUint16(8, 0, true) 15HeadBuf.setUint32(10, headSize + paletteSize, true) 16 17//情報ヘッダ 18HeadBuf.setUint32(14, headSize + paletteSize - 14, true) 19HeadBuf.setUint32(18, width, true) 20HeadBuf.setUint32(22, height, true) 21HeadBuf.setUint16(26, 1, true) 22HeadBuf.setUint16(28, 1, true) 23HeadBuf.setUint32(30, 0, true) 24HeadBuf.setUint32(34, pixelSize, true) 25HeadBuf.setUint32(38, 0, true) 26HeadBuf.setUint32(42, 0, true) 27HeadBuf.setUint32(46, 2, true) 28HeadBuf.setUint32(50, 0, true) 29 30//白のカラーパレット:0 31HeadBuf.setUint8(54, 255) 32HeadBuf.setUint8(55, 255) 33HeadBuf.setUint8(56, 255) 34HeadBuf.setUint8(57, 0) 35 36//黒のカラーパレット:1 37HeadBuf.setUint8(58, 0) 38HeadBuf.setUint8(59, 0) 39HeadBuf.setUint8(60, 0) 40HeadBuf.setUint8(61, 0)
データ部に関しては、0と1のビット列で画像データを表現しております。0のビットの場合は白、1のビットの場合は黒が表現出来ているという認識です。
発生している問題・エラーメッセージ
エラーメッセージは出ておりませんが、htmlで出力させると真っ黒の画像が表示されます。
試したこと
データ部の中身に関しては0と1が混ざったデータが入っていることが確認できたため、データ部が原因とは少し考えづらいです。
補足事項
データ部側のBufferを設定しているプログラムを一応追記しておきます。
JavaScript(データ部)
1setPictureDataChunk(data, pixelSize) 2//data :データ部が各ビットごとに0と1のみでArrayに1画素ずつ入っている 3//pixelSize :width*height/8 4 5function setPictureDataChunk(data, Size) { 6 let output = new DataView(new ArrayBuffer(Size)) 7 for (let i = 0; i < data.length; i += 8) { 8 let temp = 0 9 for (let j = 0; j < 8; j++) { 10 temp = temp << 1 11 temp += data.shift() 12 } 13 output.setUint8(i / 8, temp) 14 } 15 return output 16}
追記:出力部分のプログラム
JavaScript
1//picArrayには先述したヘッダ部とデータ部を結合したArrayBufferが入っている 2const picBlob = new Blob([picArray], { type: 'image/bmp' }) 3const picURL = myURL.createObjectURL(picBlob) 4 5const img = document.createElement('img') 6img.setAttribute('src', picURL) 7document.getElementById('show_data').appendChild(img) 8//show_dataはdiv要素
この表示部分自体は別のbmp画像をそのまま表示させた場合真っ黒にならずそのまま出力されています。
回答1件
あなたの回答
tips
プレビュー