OSの日記

通信に関する研究をする学生A

pythonでバイナリファイルに変換し、画像を作ってみた

今回は、16進数でファイルを作成し、それをバイナリファイルにそのまま変換して画像を作成してみました。

 

参考としたブログは次のものです

https://qiita.com/chooyan_eng/items/151e67684e5ef8d1a695 

 

このブログを見て、これこそ自分がやってみたかったものだと思い、実際にやってみました。その中で、自分なりの変更を加えたので刮目してください。

 

完成図

f:id:OSa:20200314101403p:plain

この画像を自分でバイナリから作成できるようにすることが今回の目標。

作り方 

  1. まずは先のブログにあるsquare_bitmap.txtを作成する
  2. square_bitmap.txtをバイナリファイル(square_bitmap.bpm)に変換する
  3. 作成したバイナリファイルのサイズを確認してsquare_bitmap.txtを完成させる
  4. もう一度square_bitmap.txtをバイナリファイル(square_bitmap.bpm)に変換する
  5. バイナリファイルの完成! macならopen square_bitmap.bmpで開いて見てみよう!

詳しく説明

      1.  まずは先のブログにあるsquare_bitmap.txtを作成する

vimなどでsquare_bitmap.txtを作成しましょう

 vim square_bitmap.txt

以下square_bitmap.txt

 ## ファイルヘッダ ##

42 4d           # ファイルタイプを2バイトで指定。Bitmapは必ず'BM' (16進数で 42 4d)
00 00 00 00     # ファイルサイズを4バイトで指定。TODO: あとで
00 00           # 予約領域1を2バイトで指定。常に0
00 00           # 予約領域2を2バイトで指定。常に0
00 00 00 00     # ファイルの先頭から画像データまでのバイト数を4バイトで指定。 TODO:あとで

## 情報ヘッダ ##
28 00 00 00     # 情報ヘッダサイズを4バイトで指定。
10 00 00 00     # 画像の横幅(単位はピクセル)を4バイトで指定。
10 00 00 00     # 画像の高さ(単位はピクセル)を4バイトで指定。
01 00           # プレーン数を2バイトで指定。常に1
01 00           # 色ビット数を2バイトで指定。今回は白黒2色なので1
00 00 00 00     # 圧縮形式を4バイトで指定。
40 00 00 00     # 画像データ部分のサイズを4バイトで指定。
10 00 00 00     # 横方向の解像度を4バイトで指定。
10 00 00 00     # 縦方向の解像度を4バイトで指定。
00 00 00 00     # パレット数を4バイトで指定。
00 00 00 00     # 重要色数を4バイトで指定。

## パレットデータ ##
ff ff ff 00     # RGB指定。4バイト目は常に0。
00 00 00 00     # RGB指定。4バイト目は常に0。

## 画像データ ##
00 00 00 00
7f fe 00 00
40 02 00 00
40 02 00 00
40 02 00 00
40 02 00 00
40 02 00 00
40 02 00 00
40 02 00 00
40 02 00 00
40 02 00 00
40 02 00 00
40 02 00 00
40 02 00 00
7f fe 00 00
00 00 00 00

      2.  square_bitmap.txtをバイナリファイル(square_bitmap.bpm)に変換する

次のpythonのファイル(バイナリファイルへ変換するファイル)を作成しましょう

 vim translate.py
import re
with open('square_bitmap.txt', 'r') as fin:
  s = fin.read()
  s = re.sub(r'[\r\n\t ]|0x|##|#(.*)|[ぁ-んァ-ン一-龥g-zA-Z]|。|、|\'|\(|\)|:|ー|(|)', '', s)
  bins = [int(a+b,16) for a, b in zip(s[::2], s[1::2])]
  with open('square_bitmap.bmp', 'wb') as fout:
     fout.write(bytearray(bins))

作成したら、square_bitmap.txtをバイナリファイルに変換しましょ変換しましょう

 python translate.py

      3.  作成したバイナリファイルのサイズを確認してsquare_bitmap.txtを完成させる

次のコマンドを実行してバイナリファイルのサイズを確認しましょう

 $ ls -l square_bitmap.bmp
-rw-r--r--@ 1 username  staff  126  3 12 17:27 square_bitmap.bmp

これでバイナリファイルのサイズが126バイトとわかる。 また、このことから全体のファイルサイズから画像データの部分を除いたオフセットは 126 - 4バイト×16行 = 62であることがわかる。

それぞれを126 → 7e、62 → 3eと16進数に変換して、バイナリファイル内のファイルヘッダにおけるTODO : あとでの部分を書き換えます

 vim square_bitmap.txt

でバイナリファイルを開いて書き換えた後のファイルヘッダ内

 ## ファイルヘッダ ##
42 4d           # ファイルタイプを2バイトで指定。Bitmapは必ず'BM' (16進数で 42 4d)
7e 00 00 00     # ファイルサイズを4バイトで指定。
00 00           # 予約領域1を2バイトで指定。常に0
00 00           # 予約領域2を2バイトで指定。常に0
3e 00 00 00     # ファイルの先頭から画像データまでのバイト数を4バイトで指定。 

      4.  もう一度square_bitmap.txtをバイナリファイル(square_bitmap.bpm)に変換する

それでは、もう一度square_bitmap.txtをバイナリファイルに変換しましょ変換しましょう

 python translate.py

      5.  バイナリファイルの完成! macならopen square_bitmap.bmpで開いて見てみよう!

はい!画像ファイルsquare_bitmap.bmp完成!

 open square_bitmap.bmp

をして画像が表示されると思います!

ちなみに、square_bitma.bmpの中身は次のコマンドで見ることができるので参考にしてみてください!

 $ od -Ad -tx1 -v square_bitmap.bmp

0000000    42  4d  7e  00  00  00  00  00  00  00  3e  00  00  00  28  00
0000016    00  00  10  00  00  00  10  00  00  00  01  00  01  00  00  00
0000032    00  00  00  00  00  00  10  00  00  00  10  00  00  00  00  00
0000048    00  00  00  00  00  00  ff  ff  ff  00  00  00  00  00  00  00
0000064    00  00  7f  fe  00  00  40  02  00  00  40  02  00  00  40  02
0000080    00  00  40  02  00  00  40  02  00  00  40  02  00  00  40  02
0000096    00  00  40  02  00  00  40  02  00  00  40  02  00  00  40  02
0000112    00  00  40  02  00  00  7f  fe  00  00  00  00  00  00
0000126

最後に

今回はバイナリから画像ファイルを作成してみました。

参考にしたブログの方と異なるのは作成したテキストファイルをバイナリファイルに変換する方法でした。

私はpythonで変換ファイルを作成したのですが、ブログにおけるコマンドが実行できなかったからであり、おそらくF#をインストールしていないからだと思います。

というわけでpythonでバイナリファイルに変換するという方法でバイナリマップを作成してみました。

 

参考ブログ

https://qiita.com/chooyan_eng/items/151e67684e5ef8d1a695

https://qiita.com/chooyan_eng/items/ce1216c947d81d287582

https://qiita.com/int_main_void/items/439d75f6673e5db53d96

 

2020/03/14 10:20