Преобразование данных: изображение из base64 в JPEG в Python

1

Из представления POST клиента мы успешно получаем изображение в следующем формате data:image/jpeg;base64,/9j/.... и файл изображения генерируется следующим кодом:

@app.route('/submission', methods=('GET', 'POST'))
def submission():

    if request.method == 'POST':

        raw_image = request.form['file']
        #Problem Starts Here
        # this doesn't work either: 
        # raw_image = raw_image.replace("data:image/jpeg;base64,/9j/", '');
        with open(UPLOADED_IMAGES_DEST+'/image.jpeg', 'wb') as fh:
            fh.write(base64.decodebytes(raw_image))
        #Problem Ends Here
        return jsonify(request.form)

    return render_template('submission.html')

Однако изображение нельзя открыть, так как это "Неверный или неподдерживаемый формат". Я пытаюсь улучшить процесс преобразования, чтобы он создавал видимый JPEG-образ.

Начало raw_image:

data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCADwAUADASIAAhEBAxEB/8QAHQAAAgIDAQEBAAAAAAAAAAAABQYEBwIDCAEACf/EAEwQAAEDAwMCBAQEAwUFBQQLAAECAxEABAUGEiExQQcTUWEIInGBFDKRoRVCUiOxwdHwJGJyouEJFjOSwhdDgvEmU2ODk7LDxNLU4v/EABsBAAMBAQEBAQAAAAAAAAAAA...

  • 2
    вы можете напечатать начало файла raw_image и image.jpeg ?
  • 0
    Я добавил raw_image но при ближайшем рассмотрении raw_image что создаваемый файл пуст и имеет raw_image 0 байт.
Показать ещё 2 комментария
Теги:
base64
image

1 ответ

1
Лучший ответ

Я взял ваши данные и расшифровал их, он выглядит довольно близко к заголовку JPEG, который я взял из реального файла (рисунок ниже). Не вижу никаких проблем, кроме того, вы должны начать декодирование из /9j/4AA... далее.

>>> a = '/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCADwAUADASIAAhEBAxEB/8QAHQAAAgIDAQEBAAAAAAAAAAAABQYEBwIDCAEACf/EAEwQAAEDAwMCBAQEAwUFBQQLAAECAxEABAUGEiExQQcTUWEIInGBFDKRoRVCUiOxwdHwJGJyouEJFjOSwhdDgvEmU2ODk7LDxNLU4v/EABsBAAMBAQEBAQAAAAAAAAAA'
>>> base64.b64decode(a)
'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xdb\x00C\x00\x03\x02\x02\x03\x02\x02\x03\x03\x03\x03\x04\x03\x03\x04\x05\x08\x05\x05

Это шестнадцатеричный дамп из реальной картинки в формате JPEG.

Изображение 174551

Вам необходимо удалить data:image/jpeg;base64, но не выходить за рамки этого - это приведет к поломке данных изображения.

  • 0
    Спасибо за вашу помощь. Теперь я получаю сообщение об ошибке в base64.decodebytes(raw_image) : TypeError: expected bytes-like object, not str base64.decodebytes(raw_image) TypeError: expected bytes-like object, not str . Я попытался переключиться на .decodestring() но получил ту же ошибку. Является ли мое использование raw_image = raw_image.replace("data:image/jpeg;base64,", ''); испортить данные?
  • 1
    @dadiletta пожалуйста, внимательно прочитайте мой ответ. если у вас есть строка, используйте base64.b64decode()
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню