Почему выходные данные в кодировке base64 отличаются для одного и того же изображения? - PullRequest
0 голосов
/ 08 февраля 2020

Эта функция ниже считывает изображение и преобразует его в строку изображения base64

def getBase64Image(filePath):
    with open(filePath, "rb") as img_file:
        my_string = base64.b64encode(img_file.read())
        my_string = my_string.decode('utf-8')
    return my_string

Однако нижеприведенная функция принимает изображение как массив (загруженный из OpenCV) и преобразует его в строку изображения base64

def convertToBase64(image):
    image.tobytes()
    my_string = base64.b64encode(image)
    my_string = my_string.decode('utf-8')
    return my_string

Выходная строка из первой функции отличается от строки, созданной второй функцией. Почему это так?

В идеале я хочу, чтобы вторая функция производила ту же строку base64, что и первая функция.

Пожалуйста, кто-нибудь может подсказать мне, как мне этого добиться?

Ответы [ 2 ]

3 голосов
/ 08 февраля 2020

Ваша первая функция использует данные изображения PNG / JPG «как есть» и кодирует их.

Ваша вторая функция использует байты RAW из RGB-представления или изображения в градациях серого и кодирует их. Если вы хотите преобразовать RAW RGB в изображение, вы можете использовать cv2.imencode(), который будет выводить PNG или JPG или что угодно.

def convertToBase64(image):
    #image.tobytes() -- don't need this
    _, converted = cv2.imencode( '.png', image)  # here the magic happens
    my_string = base64.b64encode(converted)  # and here
    my_string = my_string.decode('utf-8')
    return my_string

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

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

Вы кодируете принципиально разные структуры. Первый метод - чтение в байтах формата сжатого изображения, такого как jpeg или png. Даже если это растровое изображение, в нем хранится много дополнительных данных, которых нет в необработанных данных массива.

Второй метод - h x w x * 1005. * массив данных пикселей, преобразование его в байтовую строку, а затем 64-битное кодирование. Вы можете увидеть разницу, сравнив строки байтов черно-белого массива данных с сохраненным растровым изображением.

...