Загрузка шрифтов в ImageFont из GCS - PullRequest
0 голосов
/ 17 февраля 2020

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

Цель состоит в том, чтобы загрузить его в:

from PIL import Image, ImageFont, ImageDraw
BUCKET_NAME = 'bucket_name'
gs_path = 'path_in_bucket/object.otf'
font_file = load_font_from_gcs(gs_path)
font = ImageFont.truetype(font_file, 18)

Я пытался использовать следующие 2 функции для загрузки:

from google.cloud import storage

storage_client = storage.Client()

def load_font_from_gcs(gs_path):
    font_file = download_blob_as_string(gs_path)
    return font_file

def download_blob_as_string(source_blob_name, bucket_name=BUCKET_NAME):
    """Downloads a blob from the bucket as string."""

    storage_client = storage.Client()

    bucket = storage_client.bucket(bucket_name)
    blob = bucket.blob(source_blob_name)
    return blob.download_as_string()

Однако я продолжаю работать с кодировкой / ошибки декодирования или ошибки типа, например

File "/anaconda3/envs/ml36/lib/python3.6/site-packages/PIL/ImageFont.py", строка 161, в init шрифт, размер, индекс, кодировка, layout_engine = layout_engine TypeError: аргумент 1 должен быть закодированной строкой без нулевых байтов, а не байтов

1 Ответ

1 голос
/ 17 февраля 2020

Упаковка в BytesIO работает на моей маме c:

from io import BytesIO
...
...
font_file = load_font_from_gcs(gs_path)
font = ImageFont.truetype(BytesIO(font_file), 18)
...