@ODNik

Selenium как сохранить картинку в объект?

Доброго времени суток, уважаемые. Я работаю над личным проектом и мне необходимо сохранить изображение в переменную. Сейчас приведу свой код и постараюсь как можно точнее всё объяснить.
# я получаю src картинки через selenium, он хранится в переменной image_src
# теперь я получаю байты картинки через requests, если есть способ лучше - you are welcome
img_bytes = bytes(requests.get(image_src).content)
# и теперь я хочу сохранить эти байты как объект картинки, например PIL.Image
# но тут неполадка
# если я использую save_func, всё работает и файл появляется в директории проекта, но
# Show_as_Image не отрабатывает с сообщением not enough image data

def save_func(image_bytes):
    # path хранит в себе путь к директории проекта и задан выше
    with open(f"{path}\\image.jpg", "wb") as file:
        file.write(image)

def Show_as_Image(image_bytes):
    # from PIL import Image в начале кода
    # browser is webdriver.Chrome если так важно
    w, h = get_resolution(browser) # возвращает верное разрешение изображения, нас не интересует как оно работает
    image_obj = Image.frombytes("RGB", (w, h), image_bytes) # ошибка на этой строчке:
    # ValueError: not enough image data
    image_obj.show()


Как мне преобразовать мои байты в объект изображения, если я не хочу делать велосипед вроде:
save_func(image_bytes)
img = Image.open(f"{path}\\image.jpg")

?
  • Вопрос задан
  • 63 просмотра
Решения вопроса 1
@Vindicar
Потому что ты не понимаешь, что делает from_bytes().
Creates a copy of an image memory from pixel data in a buffer.
In its simplest form, this function takes three arguments (mode, size, and unpacked pixel data).

Оно требует массив значений пикселей, а не содержимое в файле графического формата.
Используй Image.open(). К слову, open() принимает на вход не только путь к файлу, но и файлоподобный объект. Это открывает две возможности:
1. Использовать класс io.BytesIO, чтобы хранить данные в памяти вместо временного файла.
2. Скормить PIL ответ сервера, используя .raw вместо .content.
Второй вариант предпочтительнее, так как не требует кэшировать в памяти всю картинку, но нужно проверить его работоспособность.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы