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