Pythonで画像を文字情報(base64のbytesコード)に変換する方法

2021年6月19日

今日は画像を文字情報に変換する方法を紹介します。

先日アップした「PythonとPySimpleGUIで2画面Viewerを作ってみた(改良版)」のソースコードの中で、画像を文字情報として埋め込んでいる箇所がありました。

画像を文字情報に変換する方法はまだ紹介できていなかったので、今日はそのソースコードを紹介します。

興味のある方は是非参考にしてください。

本プログラムの特徴

  • 画像を読み込んで、指定のフォルダにテキストとして保存できる
  • 文字情報はコードに埋め込んで、画像に変換することができる(詳細は前回アップした記事を参照ください)

プログラム

以下のコードをみてください。

import io
import os
import sys
import glob
import base64
import PySimpleGUI as sg

# コードに変換したい画像を指定
fname = sg.popup_get_file('base64のbytesコードに変換したい画像を選択してください')

# コードの保存先フォルダ指定
save_path = sg.popup_get_folder('base64のbytesコードの保存先フォルダを指定してください')

# 読み込んだ画像をコードに変換
# base64のbytesデータ
c = base64.encodestring(open(fname, 'rb').read())
print('コード文字数:', len(c))

# basenameでファイル名を取得して、splitextで名前と拡張子に分割
# titleとextに代入(アンパック)
title, ext = os.path.splitext(os.path.basename(fname))
print('画像ファイル名:', title)
print('拡張子:', ext)

# テキストファイルに保存
with open(save_path + "/" + str(title) +str("_base64") + '.txt', "wb") as f:
    f.write(c)

ポイント解説

1.画像をバイナリモードで読み込み、base64のbytesコードに変換

以下のコードをみてください。

c = base64.encodestring(open(fname, 'rb').read())

上記コードで open ( ( fname, ' rb ' ).read( ) ) の部分は画像をバイナリモードで読み込むコードです。

’ rb ’ の部分で b が付くとバイナリモードの読み込みになります。

これを、base64.encodestring( ) の部分でbase64のバイトコードに変換します。

2.変換したコードをテキストファイルに保存

以下のコードをみてください。

with open(save_path + "/" + str(title) +str("_base64") + '.txt', "wb") as f:
    f.write(c)

with open( ) as f : でテキストをバイナリモードで開いて、f.write( c )で書き込み、テキストファイルを閉じます。

読み込みのとき同様、’ wb ’ の部分で b が付くとバイナリモードでの書き込みになります。

3.変換したコードの文字数は画像サイズと色数に関係する

画像1は背景に黒が多い画像、画像2は背景、キャラとも色数の多い画像です。

これらの画像を、画像サイズとコード文字数の関係としてグラフ化したものが以下です。

画像1では、画像サイズが320×180ピクセルでは文字数は約78,000個ですが、1920×1080ピクセルでは約780,000個と約10倍になります。

画像2では、画像サイズが320×180ピクセルでは文字数は約145,000個ですが、1920×1080ピクセルでは約2,270,000個と約16倍になります。

つまり、画像をコード変換したときの文字数は、画像サイズだけでなく色数にも関係するということです。

まとめ

  • 画像を読み込むときはバイナリモードで読み込む
  • 画像を書き込むときもバイナリモードで書き込む
  • 画像をコード変換したときの文字数は、画像サイズだけでなく色数にも関係する