はじめに
本記事ではGoogle Cloud(GCP)のサービスであるCloud Storageにアップロードされた画像データを、Cloud Run Functions(旧Cloud Functions、以下CF)で読み込む方法について解説します。
前提
Cloud StorageをトリガーとしたCFが作成済みであること。
画像データの読み込み
Pythonを用いて、Cloud Storageで操作(アップロードなど)された画像データを、CF上で読み込みます。
- 画像データはバイト列として読み込んでいます
- client_blob.download_as_bytes():コンテンツをバイト列で読み込む。download_as_string()も同じメソッドだがこちらは廃止済み
from google.cloud import storage
@functions_framework.cloud_event
def hello_gcs(cloud_event):
data = cloud_event.data
# 操作されたCloud Storageのバケット名とファイル名の取得
# この箇所を指定したいバケット名・ファイル名に変更することで、指定したファイルを読み取ることも可能です
input_bucket_name = data["bucket"]
input_file_name = data["name"]
# Cloud Storageクライアントのインスタンス化
client = storage.Client()
# バケットとBlobの取得
client_bucket = client.bucket(input_bucket_name)
client_blob = client_bucket.blob(input_blob_name)
# Blobからバイト列として画像データをダウンロード
img_bytes = client_blob.download_as_bytes()
# 以下でデータ加工
データ加工
上記のコードの最後に、下記のコードを追加してください。
他のサーバーに送る場合
requestsなどを用いて他のサーバーに画像データを送信する場合
- 画像データをバイト列で読み込み→base64でデコード→文字列の順で変換しています。
import base64
# 他のサーバーに送る場合
img_base64 = base64.b64encode(img_bytes).decode("utf-8")
Pillow(PIL)による画像処理
例:画像のリサイズ
from PIL import Image
import io
# PILで処理する場合
img = Image.open(io.BytesIO(img_bytes))
# 画像データの処理例
# 例: 画像のリサイズ
img_resized = img.resize((300, 300))
画像データの書き込み
今後記事を作成予定
参考
- Cloud Storageからの読み取り: https://cloud.google.com/appengine/docs/legacy/standard/python/googlecloudstorageclient/read-write-to-cloud-storage?hl=ja#reading_from
- download_as_bytesに関して: https://cloud.google.com/python/docs/reference/storage/latest/google.cloud.storage.blob.Blob#google_cloud_storage_blob_Blob_download_as_bytes
- サーバー間での画像データの扱い方: https://qiita.com/betio/items/4ba6424628304277c9e9