Есть ли способ сделать миниатюру PIL фиксированной только в одном измерении и соотношении сторон?

#python #python-imaging-library

Вопрос:

У меня есть два изображения размером 339 x 1000 пикселей и 6000 x 4000 пикселей, и я хочу, чтобы они оба имели ширину 256 пикселей с сохранением пропорций (соотношение сторон).

Но команда из библиотеки PIL:

 img.thumbnail((256, 256))
 

Делает их в точности:

  1. 256×87 пикселей
  2. 171×256 пикселей

Я не могу передать только один параметр. Как установить только пользовательскую ширину и сделать ее миниатюрой с соотношением сторон?

Я предполагаю, что поведение функции заключается в том, что когда соотношение >1, то оно правильно устанавливает высоту, когда >

Ответ №1:

Вы можете рассчитать коэффициент уменьшения, необходимый для правильной ширины, и применить его к высоте:

 from PIL import Image

# Create some representative images
tall = Image.new("L",(339,1000))
wide = Image.new("L",(6000,4000))

tall_s = tall.resize((256,tall.height*256//tall.width))
wide_s = wide.resize((256,wide.height*256//wide.width))
 

Что приводит к этому:

 tall_s <PIL.Image.Image image mode=L size=256x755 at 0x7FE2F1369D30>

wide_s <PIL.Image.Image image mode=L size=256x170 at 0x7FE3003F9370>
 

Комментарии:

1. У меня растянутое изображение из вашего решения, поэтому я решил сам рассчитать пропорцию, чтобы вспомнить математику из школы, и я получаю уравнение не (высокий.высота*256//высокий.ширина), а (высокий.ширина*256//высокий.высота) для ширины, я отредактировал код, и теперь он работает, вы знаете, почему это может быть?

2. Я поменял ширину и высоту местами. Извините, пожалуйста, попробуйте скопировать мой код заново.

3. Теперь работает отлично, спасибо!