Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

画像データをバイト(文字列)データに変換

今回は画像データをバイト(文字列)データに変換する方法についてまとめておこうと思います!!


■環境

コードはpythonで書いていきます。
詳細はこちら。

・OS Windows10
python version:3.4.7

■画像データをバイト列に変換

変換のコードはこちらになります。

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()

にて開いた画像に対してバイト列に変換。変数に格納しております。


こちらの画像に対して
f:id:Elsammit:20201208230426p:plain

コードを実行すると、

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('出力画像)

今度はこちらの画像を入力。
f:id:Elsammit:20201208231252p:plain

結果はこちらです。
f:id:Elsammit:20201208231306p:plain

同じ画像が得られました!!
良かった!!

■最後に

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

この変換方法も後で後で何かに使えるかな?