Причина, почему изменение размера / миниатюра на PIL.Image не работает? питон - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь изменить размер изображения PNG. Стоит отметить, что перед тем, как изображение станет PNG, оно конвертируется из SVG (работает без проблем).

Это код:

        if format == 'png':
            output = BytesIO()
            svg2png(bytestring=monkey_image.to_str(), write_to=output)
            contents = output.getvalue()
            size = 15, 15
            img = Image.open(BytesIO(contents))
         #  tried both resize and thumbnail, same result
         #  img.thumbnail(size, Image.ANTIALIAS) 
            img = img.resize(size, Image.ANTIALIAS)
            img.save(output, format="PNG")
            contents = output.getvalue()
            output.close()
        return contents

Результат, который я вижу, состоит в том, что он возвращает изображение в исходном размере (сохраняет первое определенное содержимое)

Может быть, я неправильно сохраняю его на выходе в секунду?

1 Ответ

0 голосов
/ 17 января 2019

Вы добавляете свои данные к существующему объекту BytesIO. Дополнительные записи в такой объект не заменяют существующие данные; Запись добавляет дополнительные данные в конец файла:

>>> from io import BytesIO
>>> out = BytesIO()
>>> out.write(b'123')
3
>>> out.getvalue()
b'123'
>>> out.write(b'456')
3
>>> out.getvalue()
b'123456'

Теперь у вас есть двоичные данные для двух изображений в одном файле, но совместимые декодеры будут игнорировать конечные данные в файле изображения.

Использовать новый, пустой BytesIO() объект:

resized = BytesIO()
img.save(resized, format="PNG")
contents = resized.getvalue()

Вы также можете искать начало файла и усекать:

output.seek(0)
output.truncate()

перед повторной записью в него, но простое создание нового объекта файла в памяти является более понятным и менее подверженным ошибкам.

...