UnicodeDecodeError с использованием модуля PIL - PullRequest
0 голосов
/ 07 ноября 2018

Я получаю это сообщение об ошибке:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

Из этого кода:

from PIL import Image
import os

image_name = "mypic"
count = 0

for filename in os.listdir('pictures'):
    if filename.endswith('.jpg'):
        image_file = open('pictures/' +filename)
        image = Image.open(image_file)

        # next 3 lines strip exif
        data = list(image.getdata())
        image_without_exif = Image.new(image.mode, image.size)
        image_without_exif.putdata(data)

        image_without_exif.save('new-pictures/' + image_name + str(count) + '.jpg')
        count = count + 1;

Не уверен почему, так как это работало вчера ...

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018

Как уже говорили другие, это потому, что open пытается прочитать файл как текст. Однако вы можете решить эту проблему, открыв путь непосредственно с помощью Image.open()

img = Image.open('pictures/' + filename)

Как удобно, он напрямую примет путь к файлу и выполнит соответствующую обработку за вас; взгляните на документацию здесь!
https://pillow.readthedocs.io/en/latest/reference/Image.html#PIL.Image.open

Кроме того, возможно, еще более разумно использовать Image.open в качестве диспетчера контекста для обработки открытия и закрытия изображения по завершении ( хорошее объяснение здесь )

with Image.open('pictures/' + filename) as img:
    # process img
# closed when leaves scope
0 голосов
/ 07 ноября 2018

При использовании функции open(filename) без каких-либо дополнительных аргументов вы открываете файл в «текстовом» режиме.

Python при чтении будет считать, что файл содержит текст. Когда он находит байт со значением 255 (0xFF), он сбивается с толку, потому что ни один текстовый символ не соответствует этому байту.

Чтобы это исправить, откройте файл в байтовом режиме:

open(filename, "b")

Это говорит Python не предполагать, что он содержит текст, а дескриптор файла просто выдаст необработанные байты.

Поскольку это обычный вариант использования, PIL уже имеет открывающиеся изображения по имени файла, встроенному в:

Image.open(filename)
0 голосов
/ 07 ноября 2018

Я думаю, вам нужно открыть файл в двоичном режиме:

image_file = open('pictures/' +filename, 'rb')
...