При использовании функции open(filename)
без каких-либо дополнительных аргументов вы открываете файл в «текстовом» режиме.
Python при чтении будет считать, что файл содержит текст. Когда он находит байт со значением 255
(0xFF), он сбивается с толку, потому что ни один текстовый символ не соответствует этому байту.
Чтобы это исправить, откройте файл в байтовом режиме:
open(filename, "b")
Это говорит Python не предполагать, что он содержит текст, а дескриптор файла просто выдаст необработанные байты.
Поскольку это обычный вариант использования, PIL уже имеет открывающиеся изображения по имени файла, встроенному в:
Image.open(filename)