Как изменить размер изображения с помощью PIL и сохранить его соотношение сторон? - PullRequest
351 голосов
/ 08 ноября 2008

Есть ли очевидный способ сделать это, что мне не хватает? Я просто пытаюсь делать эскизы.

Ответы [ 14 ]

2 голосов
/ 22 мая 2013

Мой ужасный пример.

Функция получает файл, например: «pic [0-9a-z]. [Extension]», изменяет их размер до 120x120, перемещает сечение в центр и сохраняет в «ico [0-9a-z]. [Extension]», работает с портретом и пейзажем:

def imageResize(filepath):
    from PIL import Image
    file_dir=os.path.split(filepath)
    img = Image.open(filepath)

    if img.size[0] > img.size[1]:
        aspect = img.size[1]/120
        new_size = (img.size[0]/aspect, 120)
    else:
        aspect = img.size[0]/120
        new_size = (120, img.size[1]/aspect)
    img.resize(new_size).save(file_dir[0]+'/ico'+file_dir[1][3:])
    img = Image.open(file_dir[0]+'/ico'+file_dir[1][3:])

    if img.size[0] > img.size[1]:
        new_img = img.crop( (
            (((img.size[0])-120)/2),
            0,
            120+(((img.size[0])-120)/2),
            120
        ) )
    else:
        new_img = img.crop( (
            0,
            (((img.size[1])-120)/2),
            120,
            120+(((img.size[1])-120)/2)
        ) )

    new_img.save(file_dir[0]+'/ico'+file_dir[1][3:])
1 голос
/ 14 января 2019

Если вы не хотите / не хотите открывать изображение с помощью Подушки, используйте это:

from PIL import Image

new_img_arr = numpy.array(Image.fromarray(img_arr).resize((new_width, new_height), Image.ANTIALIAS))
0 голосов
/ 08 апреля 2019

Я изменил размер изображения таким образом, и он работает очень хорошо

from io import BytesIO
from django.core.files.uploadedfile import InMemoryUploadedFile
import os, sys
from PIL import Image


def imageResize(image):
    outputIoStream = BytesIO()
    imageTemproaryResized = imageTemproary.resize( (1920,1080), Image.ANTIALIAS) 
    imageTemproaryResized.save(outputIoStream , format='PNG', quality='10') 
    outputIoStream.seek(0)
    uploadedImage = InMemoryUploadedFile(outputIoStream,'ImageField', "%s.jpg" % image.name.split('.')[0], 'image/jpeg', sys.getsizeof(outputIoStream), None)

    ## For upload local folder
    fs = FileSystemStorage()
    filename = fs.save(uploadedImage.name, uploadedImage)
0 голосов
/ 15 мая 2018

Просто обновить этот вопрос с более современной оболочкой Эта библиотека обертывает Подушку (вилка PIL) https://pypi.org/project/python-resize-image/

Позволяет вам сделать что-то вроде этого: -

from PIL import Image
from resizeimage import resizeimage

fd_img = open('test-image.jpeg', 'r')
img = Image.open(fd_img)
img = resizeimage.resize_width(img, 200)
img.save('test-image-width.jpeg', img.format)
fd_img.close()

Куча примеров в приведенной выше ссылке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...