Изменить размер изображения с помощью PIL в Google Cloud Storage Bucket (из виртуальной машины в GCloud) - PullRequest
3 голосов
/ 01 мая 2019

Это то, что мне нужно: когда пользователь загружает изображение, проверьте, превышает ли это изображение какой-либо размер, если это так, измените размер.Этот код работает без ошибок, но сохраненное изображение имеет размер без изменений.Изображение находится в Google Cloud Storage Bucket, оно загружено непосредственно перед этим, но работает нормально.Любая идея приветствуется.Заранее спасибо.

from PIL import Image
from django.core.files.storage import default_storage
from google.cloud import storage
from google.cloud.storage import Blob
import io

if default_storage.exists(image_path):
    client = storage.Client()
    bucket = client.get_bucket('mybucket.appspot.com')
    blob = Blob(image_path, bucket)
    contenido = blob.download_as_string()
    fp = io.BytesIO(contenido)
    im = Image.open(fp)
    x, y = im.size
    if x>450 or y>450:
        im.thumbnail((450,450))
        im.save(fp, "JPEG")
        # im.show() here it shows the image thumbnail (thumbnail works)
        blob.upload_from_string(fp.getvalue(), content_type="image/jpeg")
        blob_dest = Blob('new_image.jpg', bucket)
        blob.download_as_string()
        blob_dest.rewrite(blob)

Ответы [ 2 ]

1 голос
/ 01 мая 2019

У вас здесь происходит много дополнительных вещей, включая сохранение изображения в локальной файловой системе, что не нужно.Этот минимальный пример должен работать:

from PIL import Image
from django.core.files.storage import default_storage
from google.cloud import storage

if default_storage.exists(image_path):
    client = storage.Client()
    bucket = client.get_bucket('mybucket.appspot.com')

    # Download the image
    im = Image.frombytes(blob=bucket.get_blob(data['name']).download_as_string())

    x, y = im.size

    if x>450 or y>450:
        # Upload the new image
        thumbnail_blob = bucket.blob('new_image.jpg')
        thumbnail_blob.upload_from_string(im.resize(450, 450).tobytes())
0 голосов
/ 02 мая 2019

Это то, что я пробовал, он копирует файл, но не изменяет его размер:

from PIL import Image
from django.core.files.storage import default_storage
from google.cloud import storage

if default_storage.exists(image_path):
    client = storage.Client()
    bucket = client.get_bucket('mybucket.appspot.com')
    fp = io.BytesIO(Blob(image_path, bucket).download_as_string())
    im = Image.open(fp)
    x, y = im.size
    if x>450 or y>450:
        thumbnail_blob = bucket.blob('new_file.jpg')
        im.thumbnail((450,450))
        im.save(fp, "JPEG")
        thumbnail_blob.upload_from_string(fp.getvalue(), content_type="image/jpeg")
...