Вам не нужно декодировать данные, и при этом вам вообще не нужно использовать bytearray()
.Numpy может принять значение bytes
напрямую, используя numpy.frombuffer()
.
Ошибка, которую вы видите, вызвана вызовом str()
:
str(bytearray(image))
, который возвращает Python-представление объекта bytearray()
:
>>> bytearray(5)
bytearray(b'\x00\x00\x00\x00\x00')
>>> str(bytearray(5))
"bytearray(b'\\x00\\x00\\x00\\x00\\x00')"
str()
вернуло строку с теми же данными, что и для первого выражения.Вы передаете префикс bytearray(b'
, буквенные символы \x
и цифры для numpy.Это 14 байтов дополнительных данных, окружающих ваши данные, и сами данные были значительно увеличены, поскольку любой непечатаемый символ был разбит на шестнадцатеричные цифры ASCII плюс обратный слеш и символ x
.Вот почему ваши данные не могут быть изменены, ваши двоичные данные имели длину 230400 байт, но были «преобразованы» в строковое представление, которое использует 597048 символов, то есть примерно 2,6 буквы на входной байт.
Если image
является значением bytes
или объектом, реализующим буферный интерфейс Python, просто передайте это значение непосредственно numpy.frombuffer()
:
nparr = np.frombuffer(image, np.uint8)
Если image
может быть целым числом или итерацией целых чисел в диапазоне (0-255), то просто создайте объект bytes()
из этого значения.Поэтому следующая строка будет работать корректно для любого типа image
:
nparr = np.frombuffer(bytes(image), np.uint8)
Существуют другие типы, которые bytearray()
могли бы принять и по-прежнему работать, но они не будут работать в вашем конкретном кодепример.