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

今日は画像を文字情報に変換する方法を紹介します。
先日アップした「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 画像2
これらの画像を、画像サイズとコード文字数の関係としてグラフ化したものが以下です。

画像1では、画像サイズが320×180ピクセルでは文字数は約78,000個ですが、1920×1080ピクセルでは約780,000個と約10倍になります。
画像2では、画像サイズが320×180ピクセルでは文字数は約145,000個ですが、1920×1080ピクセルでは約2,270,000個と約16倍になります。
つまり、画像をコード変換したときの文字数は、画像サイズだけでなく色数にも関係するということです。
まとめ
- 画像を読み込むときはバイナリモードで読み込む
- 画像を書き込むときもバイナリモードで書き込む
- 画像をコード変換したときの文字数は、画像サイズだけでなく色数にも関係する
ディスカッション
コメント一覧
まだ、コメントがありません