【Python】7680×4320ピクセルの画像にデータを埋め込んでみた

  1. はじめに
    近年、高解像度ディスプレイの普及に伴い、より大きな画像サイズが求められるようになりました。そこで今回は、Python を使って7680×4320ピクセルの大きな画像にデータを埋め込む方法を紹介します。
  2. データを画像に埋め込む
    まず、データを画像に埋め込むためのコードを見ていきましょう。
import numpy as np
from PIL import Image

def encode_data(data):
    # データをバイト列に変換
    data_bytes = data.encode('utf-8')

    # バイト列をビット列に変換
    data_bits = ''.join(format(byte, '08b') for byte in data_bytes)

    # 画像のサイズを計算
    num_pixels = len(data_bits)
    width = 7680 // 4
    height = 4320 // 4

    # 画像データを初期化
    image_data = np.zeros((height * 4, width * 4), dtype=np.uint8)

    # ビット列を画像データに変換
    for i, bit in enumerate(data_bits):
        if i >= num_pixels:
            break
        row, col = (i // width) * 4, (i % width) * 4
        value = int(bit) * 255
        image_data[row:row+4, col:col+4] = value

    # 画像を作成
    image = Image.fromarray(image_data, mode='L')
    return image

このコードでは、以下の手順でデータを画像に埋め込んでいます。

  1. データをUTF-8でエンコードしてバイト列に変換
  2. バイト列をビット列に変換
  3. 画像のサイズを計算(7680×4320ピクセルを4×4ピクセルのドットで表現)
  4. 画像データを初期化
  5. ビット列を画像データに変換(1ビットを4×4ピクセルで表現)
  6. 画像を作成
  7. 画像からデータを読み出す
    次に、埋め込んだデータを画像から読み出すためのコードを見ていきましょう。
def decode_data(image):
    # 画像をNumPy配列に変換
    image_data = np.array(image)

    # 画像サイズを取得
    height, width = image_data.shape

    # ビット列を格納する配列を初期化
    data_bits = []

    # 画像データからビット列を復元
    for row in range(0, height, 4):
        for col in range(0, width, 4):
            value = image_data[row, col]
            bit = '1' if value > 127 else '0'
            data_bits.append(bit)

    # ビット列をバイト列に変換
    data_bytes = [int(''.join(data_bits[i:i+8]), 2) for i in range(0, len(data_bits), 8)]

    # バイト列をデータに変換
    data = bytes(data_bytes).decode('utf-8')

    return data

このコードでは、以下の手順でデータを読み出しています。

  1. 画像をNumPy配列に変換
  2. 画像のサイズを取得
  3. ビット列を格納する配列を初期化
  4. 画像データからビット列を復元(4×4ピクセルごとに値を読み取る)
  5. ビット列をバイト列に変換
  6. バイト列をUTF-8でデコードしてデータに変換
  7. まとめ
    以上のように、PythonとNumPyを使って7680×4320ピクセルの大きな画像にデータを埋め込み、その画像からデータを読み出す方法を紹介しました。この方法では、1ビットを4×4ピクセルの正方形で表現しているため、画像の劣化に対して頑健であると期待できます。

ただし、画像のサイズが大きくなるため、データ量も増加することに注意が必要です。また、画像の変換や保存の過程でデータが失われる可能性があるので、可逆圧縮(PNGなど)を使用し、画像の品質を維持することが重要です。

今回紹介した方法を応用することで、画像を使ったデータの保存や転送など、様々な用途に活用できるでしょう。