メインコンテンツへスキップ
【Python】 バイナリデータの画像を扱う

【Python】 バイナリデータの画像を扱う

·3 分
Programming Python
かずさプログラマー
著者
かずさプログラマー
業務の作業自動化を行っています。Go、VBA、Pythonを主に使用しています。過去にはC#、VB.Net、JavaScriptも使用していました。
目次

Webの画像をhttpのGetで取得するとバイナリデータとして取得します。
取得したデータをPC上に保存しないとバイナリデータとして扱うことになりますが
BytesIOを経由すれば、Pillowなどの画像モジュールを利用して画像を操作できます。

Web上の画像を取得
#

Web上に存在する画像を読み込んで操作してみます。
サンプルとしてブログやTwitterで使用している顔アイコンの画像を利用します。

Web上の画像の呼び出しにrequests、画像の操作にPillowを使用します。
pipを使用してインストールします。

pip install requests pillow

Web上の画像の呼び出して操作するコードは以下になります。

from io import BytesIO
from PIL import Image, ImageOps
import requests

picture_url = 'https://kazusa-pg.com/wp-content/uploads/2018/10/profile-picture1.png'
response = requests.get(picture_url)
img = Image.open(BytesIO(response.content))
flipped_img = ImageOps.flip(img)
flipped_img.show()

コードの解説
#

picture_url = 'https://kazusa-pg.com/wp-content/uploads/2018/10/profile-picture1.png'
response = requests.get(picture_url)

requests.getメソッドで取得した情報をresponse変数に格納します。

img = Image.open(BytesIO(response.content))

response変数のcontentに取得した画像のバイナリデータが入っているのでBytesIOを経由してPillowで読み込みます。

flipped_img = ImageOps.flip(img)
flipped_img.show()

Pillowで扱える形式になれば、あとはPillowのメソッドを使用して画像を操作します。
ImageOps.flipを使用して画像を反転後、画像を表示します。

上記のコードの例では、顔アイコンの画像を反転した形で表示します。

PC上の画像をバイナリデータとして読み込む
#

PC上に保存された画像をバイナリデータとして操作する機会はそれほどありませんが
Web画像APIを利用するときに、PC上の画像をバイナリデータとして送付する必要があります。

WebAPIに情報を送付するためにrequests、画像の操作にPillowを使用します。
pipを使用してインストールします。

pip install requests pillow

ローカル上の画像をバイナリデータとして読み込み、WebAPIに送付するPythonのコードは以下になります。

from io import BytesIO
import requests
from PIL import Image

api_url = 'APIのエンドポイント'
headers = {'ヘッダー情報'}
params = {'パラメータ'}
data = open('sample.png', 'rb').read()
response = requests.post(api_url, headers=headers, params=params, data=data)
img = Image.open(BytesIO(response.content))
img.save('processed_sample.png')

コードの解説
#

api_url = 'APIのエンドポイント'
headers = {'ヘッダー情報'}
params = {'パラメータ'}

requestsで利用するAPIのエンドポイント、ヘッダー情報、パラメータを変数に格納します。

data = open('sample.png', 'rb').read()

openでrbを引数として読み込むとsample.pngをバイナリデータとして開きます。
readメソッドでバイナリデータを読み込みます。

response = requests.post(api_url, headers=headers, params=params, data=data)

requests.postでWebAPIにデータを送信して、結果をresponseに格納します。

img = Image.open(BytesIO(response.content))
img.save('processed_sample.png')

response変数のcontentに取得した画像のバイナリデータが入っているのでBytesIOを経由してPillowで読み込み保存します。

関連記事

【Python】画像から物体の種類、座標、幅、高さを検出する
·4 分
Programming Python
【Python】Seleniumでiframeの内容を操作する
·3 分
Programming Python
【Python】テキストファイルの文字コードを判別してファイルを開く
·3 分
Programming Python