何らかの符号方式でバイナリデータを画像化

2/4変調符号という，某分野で用いられる符号方式で[ここ](https://qiita.com/strv13570/items/fb6d5f5dcc0e862b54cd)で生成した2進ダンプテキストファイルを画像化します．この符号方式では，画像中の1と0の値の数が常に等しくなります．用途の詳細は解説しません．

```python:genpage.py
import sys
import numpy as np
import math
from PIL import Image

np.set_printoptions(edgeitems=10)

argv = sys.argv
argc = len(argv)

if argc == 4:
    pix = int(argv[3])
else:
    pix = 1024

binary = ''
with open(argv[1], 'rb') as inf:
    binary = inf.readline()
binary_str = str(binary.decode()) + "00000000"

page_max_bits = int((pix*pix)/2)
data_bits = len(binary_str)
data_bytes = int(data_bits / 8)
page_num = math.ceil(len(binary_str) / page_max_bits)
total_max_bits = page_num * page_max_bits

over_bits = total_max_bits - data_bits
over_bytes = int(over_bits / 8)

print("ページサイズ:{0}x{0}".format(pix))
print("使用ページ数:{}".format(page_num))
print("ページ保存可能ビット:{}".format(page_max_bits))
print("合計保存可能ビット:{}".format(total_max_bits))
print("保存データビット:{}".format(data_bits))
print("保存データバイト:{}".format(data_bytes))
print("余剰ビット:{}".format(over_bits))
print("余剰バイト:{}".format(over_bytes))
print()
print("生成開始")

for i in range(over_bytes):
    if i % 2 == 0:
        binary_str += "11101100"
    elif i % 2 == 1:
        binary_str += "00010001"

page_arrays = np.zeros((page_num, pix, pix))

#print(binary_str[:100])

count = 0
for page in range(page_num):
    page_point = page*page_max_bits
    page_binary = binary_str[page_point:]
    for py in range(int(pix / 2)):
        for px in range(int(pix / 2)):
            pix_point = px
            # print(binary_str[count*2:(count*2)+2])
            if binary_str[count*2:(count*2)+2] == '00':
                page_arrays[page][py*2][px*2+1] = 255
            elif binary_str[count*2:(count*2)+2] == '01':
                page_arrays[page][py*2][px*2] = 255
            elif binary_str[count*2:(count*2)+2] == '10':
                page_arrays[page][py*2+1][px*2+1] = 255
            elif binary_str[count*2:(count*2)+2] == '11':
                page_arrays[page][py*2+1][px*2] = 255
            count += 1

for page in range(page_num):
    Image.fromarray(page_arrays[page]).convert("L").save("{0}{1}.png".format(argv[2], page))
```
# 使ってみる
![stn.jpg](https://qiita-image-store.s3.amazonaws.com/0/225893/c5900b77-b54b-a871-f330-b34f4070392b.jpeg)
↑この画像を，記事冒頭で上げた2進ダンプの記事の通りにダンプします．
ダンプすると[このファイル](https://raw.githubusercontent.com/strvworks/holopage/master/example/stn.bin)になります．これを上のプログラムに`python stn.bin stn_page 512`として渡します．ざっくり言うと，1つ目に渡したバイナリダンプファイルをもとに，2つ目に渡したテキストをベースとした名前を持つ，3つ目に渡したピクセル数を一辺とする正方形画像を生成させることになります．

こんなのができます．
![stn_page0.png](https://qiita-image-store.s3.amazonaws.com/0/225893/b86bd20d-65aa-e32d-be0a-e177d64c1c2e.png)

![stn_page1.png](https://qiita-image-store.s3.amazonaws.com/0/225893/da2dbc0d-05df-3e55-d93d-46d65f116e3e.png)

![stn_page2.png](https://qiita-image-store.s3.amazonaws.com/0/225893/e5a12fd9-34c9-dc6e-db93-4fcf908cc27f.png)

![stn_page3.png](https://qiita-image-store.s3.amazonaws.com/0/225893/0cfbb46b-a88d-5da8-23ae-65204f9ce996.png)

![stn_page4.png](https://qiita-image-store.s3.amazonaws.com/0/225893/20b288e1-c3a7-c867-279f-b397b9309632.png)

![stn_page5.png](https://qiita-image-store.s3.amazonaws.com/0/225893/a07a60bf-03ef-6a50-0f70-d3365399da9e.png)

渡すピクセル増やすと生成される枚数は減ります．これは1024で作ったとき．
![stn_page0.png](https://qiita-image-store.s3.amazonaws.com/0/225893/f4c0c028-42a5-37fe-0ffc-55e809290b3a.png)


# 感想
以上です．