Webの画像をhttpのGetで取得するとバイナリデータとして取得します。
取得したデータをPC上に保存しないとバイナリデータとして扱うことになりますが
BytesIOを経由すれば、Pillowなどの画像モジュールを利用して画像を操作できます。
Web上の画像を取得
Web上に存在する画像を読み込んで操作してみます。
サンプルとしてブログやTwitterで使用している顔アイコンの画像を利用します。
Web上の画像の呼び出しにrequests、画像の操作にPillowを使用します。
pipを使用してインストールします。
1 |
pip install requests pillow |
Web上の画像の呼び出して操作するコードは以下になります。
1 2 3 4 5 6 7 8 9 |
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() |
コードの解説
1 2 |
picture_url = 'https://kazusa-pg.com/wp-content/uploads/2018/10/profile-picture1.png' response = requests.get(picture_url) |
requests.getメソッドで取得した情報をresponse変数に格納します。
1 |
img = Image.open(BytesIO(response.content)) |
response変数のcontentに取得した画像のバイナリデータが入っているので
BytesIOを経由してPillowで読み込みます。
1 2 |
flipped_img = ImageOps.flip(img) flipped_img.show() |
Pillowで扱える形式になれば、あとはPillowのメソッドを使用して画像を操作します。
ImageOps.flipを使用して画像を反転後、画像を表示します。
上記のコードの例では、顔アイコンの画像を反転した形で表示します。
PC上の画像をバイナリデータとして読み込む
PC上に保存された画像をバイナリデータとして操作する機会はそれほどありませんが
Web画像APIを利用するときに、PC上の画像をバイナリデータとして送付する必要があります。
WebAPIに情報を送付するためにrequests、画像の操作にPillowを使用します。
pipを使用してインストールします。
1 |
pip install requests pillow |
ローカル上の画像をバイナリデータとして読み込み、WebAPIに送付する
Pythonのコードは以下になります。
1 2 3 4 5 6 7 8 9 10 11 |
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') |
コードの解説
1 2 3 |
api_url = 'APIのエンドポイント' headers = {'ヘッダー情報'} params = {'パラメータ'} |
requestsで利用するAPIのエンドポイント、ヘッダー情報、パラメータを変数に格納します。
1 |
data = open('sample.png', 'rb').read() |
openでrbを引数として読み込むとsample.pngをバイナリデータとして開きます。
readメソッドでバイナリデータを読み込みます。
1 |
response = requests.post(api_url, headers=headers, params=params, data=data) |
requests.postでWebAPIにデータを送信して、結果をresponseに格納します。
1 2 |
img = Image.open(BytesIO(response.content)) img.save('processed_sample.png') |
response変数のcontentに取得した画像のバイナリデータが入っているので
BytesIOを経由してPillowで読み込み保存します。
コメント