やりたいこと
Google Cloud Storage(GCS)に保存した画像ファイルを、リサイズして、別ファイルとしてGCSに再アップロードしたい。
困った点
どうやったらPILのImageをCloudStorageにアップロードできる形にできるのか。。。
GAEではローカルファイルシステムに書き込みできないので、ファイルを一時保存して読み込む実装は不可。
解決策
こちらのサイトを参考にした。
ファイルオブジェクトでアップロードする方法だと、ValueError: Stream must be at beginning.
が発生してうまく行かなかった。
そのため、stringからアップロードして、JPEGで保存できるように実装した。
import io
from google.cloud import storage
from google.cloud.storage import Blob
from PIL import Image
# GCSから写真データを取得
client_storage = storage.Client()
bucket = client_storage.get_bucket('Bucket name')
target = bucket.get_blob('target_name')
# bytes形式で読み込み
img = Image.open(io.BytesIO(target.download_as_string()))
# resize処理
width_rev = 1200
height_rev = img.height * width_rev / img.width
img_resize = img.resize((int(width_rev), int(height_rev)))
# メモリでデータを保持する
bio = io.BytesIO()
img_resize.save(bio, format='jpeg')
# リサイズされた画像をGCSへアップロード
blob = Blob("file_name", bucket)
blob.upload_from_string(data=bio.getvalue(), content_type="image/jpeg")