今回は画像データをバイト(文字列)データに変換する方法についてまとめておこうと思います!!
■画像データをバイト列に変換
変換のコードはこちらになります。
import os
import io
from PIL import Image
import numpy as np
class ImgByteChange:
def __init__(self):
pass
def ImageToByte(self,Img):
tmpimg = Image.open(Img)
with io.BytesIO() as output:
tmpimg.save(output,format="PNG")
ImgToByte = output.getvalue()
return ImgToByte
imgByteChange = ImgByteChange()
test = imgByteChange.ImageToByte(画像ファイルパス)重要なのは、
def ImageToByte(self,Img):
tmpimg = Image.open(Img)
with io.BytesIO() as output:
tmpimg.save(output,format="PNG")
ImgToByte = output.getvalue()です。
イメージファイルをオープンしてから、
with io.BytesIO() as output:
tmpimg.save(output,format="PNG")
ImgToByte = output.getvalue()にて開いた画像に対してバイト列に変換。変数に格納しております。
こちらの画像に対して

コードを実行すると、
b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x96\x00\x00\x00\x96\x08\x00\x00\x00\x00\x19j.>\x00\x00\x00\xa7IDATx\x9c\xed\xd9A\n\x021\x10\x00\xc1(\xfb\xff/\xeb\x0b\xe6\xd0\x8b\xe8\x08U\xd7\x10\xd2\xccm\xc89\x00\x00\x00\xb0\xdec<y\xfd\xf2\xf5\xe7\x17\x1e\xbfAV!\xab\x90U\xc8*d\x15\xb2\nY\x85\xacBV!\xab\x90U,\xcd\xba\xfa\x95y\xe3\x9d\xf4Mx\xe9\xb4d\x15\xb2\nY\x85\xacBV!\xab\x90U\xc8*d\x15\xb2\nY\x85\xacBV!\xab\x90U\xc8*d\x15\xb2\nY\x85\xacBV!\xab\x90U\xc8*\xe6\xdf\xd7\xfe\xc9\xfaAK\xa7%\xab\x90U\xc8*d\x15\xb2\nY\x85\xacBV!\xab\x90U\xc8*\x96f\x01\x00\x00\xc0\x1fx\x03\xe9R\x02\xcdQ\x93\xdcP\x00\x00\x00\x00IEND\xaeB`\x82'
というようにバイト列(文字列)が得られます。
■バイト列から画像イメージに変換
今度は逆にバイト列から画像イメージに変換するコードを記載します。
そのコードはこちら。
import os
import io
from PIL import Image
import numpy as np
class ImgByteChange:
def __init__(self):
pass
def ByteToImage(self, str):
ByteToImg = Image.open(io.BytesIO(str))
return ByteToImg
imgByteChange = ImgByteChange()
img = imgByteChange.ByteToImage(バイト列)こちらが今回の重要点。
Image.open(io.BytesIO(str))
こちらのコードで文字列から画像イメージに変換しています。
バイト列を変数に与えるのは大変なので、
こちらのコードを用いて、画像⇒文字列⇒画像の順に変換して画像を見比べてみたいと思います。
import os
import cv2
import io
from PIL import Image
import numpy as np
class ImgByteChange:
def __init__(self):
pass
def ImageToByte(self,Img):
tmpimg = Image.open(Img)
with io.BytesIO() as output:
tmpimg.save(output,format="PNG")
ImgToByte = output.getvalue()
return ImgToByte
def ByteToImage(self, str):
ByteToImg = Image.open(io.BytesIO(str))
return ByteToImg
imgByteChange = ImgByteChange()
test = imgByteChange.ImageToByte(入力画像)
img = imgByteChange.ByteToImage(test)
img.save('出力画像)今度はこちらの画像を入力。

結果はこちらです。

同じ画像が得られました!!
良かった!!
■最後に
今回は画像データのバイト列(文字列データ変換とバイト列データを画像データに変換する方法についてまとめました。
実はこちらを用いて、実行ファイル同士で共有メモリ通信的なことをしてデータのやり取りしようかな?と思っていたのですが、
別の方法が分かったのでそちらで画像データのやり取りをする方法をまとめたいと思います!!
この変換方法も後で後で何かに使えるかな?