PIL UnidentifiedImageError от триггера BLOB-объектов Azure, хотя изображение открывается в «смотреть»

Я пытаюсь локально отлаживать функцию Azure с помощью триггера BLOB-объектов. При загрузке файла изображения в Azure триггер получает моя функция, работающая локально.

def main(blobin: func.InputStream, blobout: func.Out[bytes], context: func.Context):
    logging.info(f"Python blob trigger function processed blob \n"
                 f"Name: {blobin.name}\n"
                 f"Blob Size: {blobin.length} bytes")

    image_file = Image.open(blobin)

Моя функция.json

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "blobin",
      "type": "blobTrigger",
      "direction": "in",
      "path": "uploads/{name}",
      "connection": "STORAGE"
    },
    {
      "name": "blobout",
      "type": "blob",
      "direction": "out",
      "path": "uploads/{blob_name}_resized.jpg",
      "connection": "STORAGE"
    }
  ]
}

Ошибка, которую я получаю, когда выполняется строка Image.open(blobin):

System.Private.CoreLib: Исключение при выполнении функции: Functions.ResizePhoto. System.Private.CoreLib: Результат: Сбой Исключение: UnidentifiedImageError: не удается идентифицировать файл изображения ‹_io.BytesIO объект по адресу 0x0000017FD4FD7F40›

Интересно то, что само изображение открывается в окне просмотра VSCode, но происходит сбой при запуске кода. Он также выдает ту же ошибку, что и выше, если я снова добавлю его в часы (вероятно, вызовет обновление часов).

Наблюдение за VSCode


person Alexandru Antochi    schedule 18.02.2021    source источник


Ответы (2)


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

import logging
from PIL import Image
import azure.functions as func
import tempfile
import ntpath
import os


def main(blobin: func.InputStream, blobout:func.Out[func.InputStream], context: func.Context):
    logging.info(f"Python blob trigger function processed blob \n"
                 f"Name: {blobin.name}\n"
                 f"Blob Size: {blobin.length} bytes")

    temp_file_path = tempfile.gettempdir() + '/' + ntpath.basename(blobin.name)
    print(temp_file_path)
    image_file = Image.open(blobin)
    image_file.resize((50,50)).save(temp_file_path)

    blobout.set(open(temp_file_path, "rb").read())

    os.remove(temp_file_path)

функция.json:

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "blobin",
      "type": "blobTrigger",
      "direction": "in",
      "path": "samples-workitems/{name}",
      "connection": "STORAGE"
    },
    {
      "name": "blobout",
      "type": "blob",
      "direction": "out",
      "path": "resize/{name}",
      "connection": "STORAGE"
    }
  ]
}

Обратите внимание, что вы не должны хранить изображение с измененным размером в том же контейнере, так как это приведет к бесконечному циклу (новое изображение запускает триггер большого двоичного объекта и снова и снова изменяет размер), и ваша проблема связана с тем, что изображение с новым размером выводится неправильно, так что исключение возникает во время запуска: Image.open(blobin)

Во всяком случае, приведенный выше код у меня отлично работает, см. результат ниже:

Загрузите большое изображение: введите здесь описание изображения

измените размер изображения и сохраните его в другом контейнере: введите здесь описание изображения

person Stanley Gong    schedule 18.02.2021

Оказывается, установка точки останова в строке Image.open(blobin) каким-то образом прерывает функцию. Удаление его оттуда и добавление в следующую строку больше не вызывает ошибку. Возможно, Azure не любит ждать и тайм-аут потока? Кто знает.

person Alexandru Antochi    schedule 18.02.2021