Как менять размер изображения при помощи Python?
Возможно, вам нужно изменить размер фотографии, используя для этого Python. Лично мне это необходимо для размещения изображений для рассылки по почте или для поста на сайте, но изображения слишком большие. Как правило, для этих целей используют редакторы. Я также пользуюсь ими, но ради интереса я покажу, как это делается при помощи языка программирования Python. Самый быстрый способ сделать это – использовать пакет Pillow, который можно установить при помощи pip.
После этого, открываем свой любимый редактор кода и пробуем следующий код:
Здесь мы импортируем класс Image из пакета Pillow. Далее, мы видим функцию, которая принимает три аргумента:
- Локация файла, который мы хотим открыть;
- Локацию, куда мы хотим сохранить измененное изображение;
- Кортеж, который демонстрирует новый размер изображения, где кортеж – это ширина и высота.
Далее, мы открываем изображение и вводим его размер. После этого, мы вызываем метод resize() объекта изображения с размером переданного кортежа. Наконец, мы берем новый размер, выводим его и открываем изображение перед тем, как сохранить изменения. Теперь оно выглядит вот так:

Как мы видим, метод resize() ничего не делает с масштабированием. Давайте разберемся с этой задачей!
Масштабирование изображения
Скорее всего, изменять размер изображения таким образом, как мы видели выше, вам не хочется, для лучшего результата нужно написать метод масштабирования. Проблема с предыдущим методом в том, что он не учитывает соотношения сторон картинки. Так что вместо изменения размера, вы можете просто использовать метод thumbnail(). Давайте попробуем:
Получение и изменение размера изображения в Python
Чтобы получить размер изображения с помощью Pillow в Python, используйте свойство size объекта Image. Свойство size возвращает ширину и высоту изображения.
В этом уроке мы узнаем, как получить размер изображения, другими словами, ширину и высоту изображения, используя библиотеку Pillow.
Синтаксис
Синтаксис для использования свойства size объекта PIL Image приведен ниже.
Пример 1
В следующей программе мы будем читать и изображать, а затем распечатывать его размер, используя свойство size объекта Image.
Пример 2: доступ к ширине и высоте
Вы можете получить доступ к высоте и ширине из свойства size, используя index. В следующем примере мы получим ширину и высоту изображения.
В этом руководстве на примерах Python мы узнали, как получить размер изображения с помощью библиотеки Python Pillow с помощью хорошо подробных примеров программ.
Изменение размера изображения
Чтобы изменить размер изображения с помощью Pillow, вы можете использовать метод resize() класса PIL.Image.Image. Вы можете передать такие параметры, как размер результирующего изображения, фильтр передискретизации пикселей и область блока источника, которую необходимо учитывать.
Синтаксис
Синтаксис метода resize() показан в следующем фрагменте кода.
- size передается, как кортеж (ширина, высота). Это размер, запрошенный для результирующего выходного изображения после изменения размера.
- resample – это фильтр, который должен использоваться для повторной выборки, это необязательно. Вы можете пройти:
- PIL.Image.NEAREST;
- PIL.Image.BOX;
- PIL.Image.BILINEAR;
- PIL.Image.HAMMING;
- PIL.Image.BICUBIC;
- PIL.Image.LANCZOS.
Если для параметра размера заданы правильные значения, вы можете уменьшить или увеличить входное изображение.
Пример 1: со значениями по умолчанию
В следующем примере мы прочитаем изображение и изменим его размер до (200, 200).


Для изменения размера рассматривается все исходное изображение, поскольку мы не предоставили никакого значения для параметра box. В следующем примере мы предоставим параметр box и найдем выходное изображение.
Пример 2: с помощью поля входного изображения
В следующем примере мы предоставим параметр box. При этом мы рассматриваем только область поля входного изображения, а затем изменяем его размер до нужного размера.

Если вы заметили, для действия изменения размера учитывается только прямоугольная часть входного изображения.
В этом руководстве на примерах Python мы узнали, как изменить размер изображения с помощью библиотеки PIL.
Введение в обработку изображений в Python при помощи Pillow
Бывает такой заходишь на почту и видишь очередную подборку статей, которые никогда не прочитаешь, но тут так сошлись звезды, что и открыл статью, и прочел, и придумал, где на практике пригодится. А теперь хочу поделиться статьей с Хабром, чтобы если кому-то нужен будет простой и понятный гайд по работе с изображениями на Python — пожалуйста.
Pillow — это свободно распространяемая библиотека для работы с изображениями (далее Imaging Library) на Python с открытым исходным кодом, которая добавляет вашему коду поддержку открытия, изменения и сохранения изображений в различных расширениях.
Давайте начнем
Самый важный класс в Imaging Library Python — это класс Image, определенный в одноименном модуле. Мы используем open(), чтобы открыть изображение в нашей локальной директории, как показано ниже:
Это просто! Теперь вы умеете считывать изображения с помощью Pillow, а значит можно приступать к обработке изображения с его помощью. Вы также можете проверить тип изображения, которое мы только что загрузили.
Вы можете посмотреть свойства изображения, например:
- формат
- размер
- цветовой режим
Кроме того, вы можете вывести на экран изображение, используя метод show

Конвертирование расширения изображения
Когда вы закончите работать с изображением при помощи библиотеки Pillow в изначальном расширении, вы можете пересохранить его в других форматах, например, их jpg сделать png или многие другие.
Для примера, давайте попробуем написать простую программу на Python для преобразования всех изображений в каталоге вашего проекта, которые находятся в формате jpg, в формат png.

После того, как вы запустите приведенный выше код, в каталоге проекта, состоящем из изображений в формате jpg, откроются все изображения и преобразуются в .png, как показано на скриншоте. Вы можете повторить тот же процесс для преобразования изображений в другие преобразований.
Обрезка изображения
Pillow также может использоваться для обрезки изображения, при этом вы можете получить производный прямоугольник выбранного изображения, указав координаты, по которым преобразовать изображение.

Как мы видим, изображение было успешно обрезано. Координаты обрезанной поверхности представлены диагональными координатами.
При этом первые две точки находятся (x, y) от верхней левой диагональной точки, а следующие две точки (x2, y2) также являются диагональной точкой снизу справа.
Геометрическое преобразование
С помощью Pillow мы можем выполнять некоторые геометрические преобразования над изображением, включая изменение размера и поворот изображения.
Эти знания играют большую роль при генерации данных для глубокого обучения путем преобразования одного изображения в тонны других изображений с разных ракурсов.
Изменение размера изображения
Когда вы запустите приведенный выше код, вы должны увидеть новое изображение с измененным размером в вашем каталоге с размером 320 на 320.
Поворот изображения

Используйте функцию вращения для создания 360 изображений одного из того же изображения под разными углами — это поможет сгенерировать данные, которые вы потенциально можете использовать для обучения своей модели глубокого обучения.
Генератор изображений
После запуска скрипта, вы должны увидеть 360 изображений одного и того же исходного изображения с разным поворотом, как показано ниже.

Фильтрация изображений
Фильтрация — это метод изменения или улучшения изображения. Например, вы можете отфильтровать изображение, чтобы выделить определенные особенности или удалить другие.
Фильтрация изображений используется для получения различных результатов, как, например,- сглаживание, повышение резкости, удаление шума и обнаружение краев.
В библиотеке Pillow доступно множество фильтров, включая BLUR, BoxBlur, CONTOUR, FIND_EDGES, Filter, GaussianBlur, Kernel, MaxFilter, MedianFilter, SHARPEN, SMOOTH и т.д.
Пример использования
Давайте попробуем найти края на изображении ниже, используя фильтр FIND_EDGES.

Таким же образом вы можете экспериментировать с другими фильтрами в Python библиотеке Pillow в зависимости от того, что вы пытаетесь сделать.
Чтение изображения из открытого файла
Кроме того, вы можете использовать Pillow для чтения изображения из файлового объекта Python, как показано ниже
Чтение изображения из URL
В этом случае вам придется использовать Pillow в сочетании с запросами. Запросы должны будут отправлять GET-request на сервер, чтобы получить необработанные байты изображения, а уже Pillow считает эти байты.

Создание новых изображений
С помощью Pillow вы также можете создать новое пустое изображение, которое может понадобиться для различных целей. Используйте Image.new() для создания совершенно нового изображения.
Синтаксис:
Пример использования:

Рисование прямоугольников на изображениях
Pillow также может использоваться для рисования прямоугольника на изображениях. Обычно это делают при обнаружении объекта. При этом вы можете нарисовать не просто прямоугольник, а рамку над обнаруженным объектом.
Пример исползования
Давайте попробуем нарисовать прямоугольную рамку внутри пустого изображения.

Первые две координаты представляют (x, y) левой верхней части, а следующие две (x2, y2) представляют координатную точку правой нижней части.
Рисование текста на изображениях
Мы также можем использовать библиотеку Pillow для рисования текста на изображениях.
How do I resize an image using PIL and maintain its aspect ratio?
Is there an obvious way to do this that I’m missing? I’m just trying to make thumbnails.
23 Answers 23
Define a maximum size. Then, compute a resize ratio by taking min(maxwidth/width, maxheight/height) .
The proper size is oldsize*ratio .
There is of course also a library method to do this: the method Image.thumbnail .
Below is an (edited) example from the PIL documentation.
This script will resize an image (somepic.jpg) using PIL (Python Imaging Library) to a width of 300 pixels and a height proportional to the new width. It does this by determining what percentage 300 pixels is of the original width (img.size[0]) and then multiplying the original height (img.size[1]) by that percentage. Change "basewidth" to any other number to change the default width of your images.

I also recommend using PIL’s thumbnail method, because it removes all the ratio hassles from you.
One important hint, though: Replace
by default, PIL uses the Image.NEAREST filter for resizing which results in good performance, but poor quality.
Based in @tomvon, I finished using the following (pick your case):
a) Resizing height (I know the new width, so I need the new height)
b) Resizing width (I know the new height, so I need the new width)

If you are trying to maintain the same aspect ratio, then wouldn’t you resize by some percentage of the original size?
For example, half the original size

You can combine PIL’s Image.thumbnail with sys.maxsize if your resize limit is only on one dimension (width or height).
For instance, if you want to resize an image so that its height is no more than 100px, while keeping aspect ratio, you can do something like this:
Keep in mind that Image.thumbnail will resize the image in place, which is different from Image.resize that instead returns the resized image without changing the original one.
EDIT: Image.ANTIALIAS raises a deprecation warning, and will be removed in PIL 10 (July 2023). Instead, you should use Resampling.LANCZOS :
I use this library:

If you don’t want / don’t have a need to open image with Pillow, use this:

Just updating this question with a more modern wrapper This library wraps Pillow (a fork of PIL) https://pypi.org/project/python-resize-image/
Allowing you to do something like this :-
Heaps more examples in the above link.
Open your image file
Use PIL Image.resize(size, resample=0) method, where you substitute (width, height) of your image for the size 2-tuple.
This will display your image at original size:
This will display your image at 1/2 the size:
This will display your image at 1/3 the size:
This will display your image at 1/4 the size:
I will also add a version of the resize that keeps the aspect ratio fixed. In this case, it will adjust the height to match the width of the new image, based on the initial aspect ratio, asp_rat, which is float (!). But, to adjust the width to the height, instead, you just need to comment one line and uncomment the other in the else loop. You will see, where.
You do not need the semicolons (;), I keep them just to remind myself of syntax of languages I use more often.
And, it is done. I tried to document it as much as I can, so it is clear.
I hope it might be helpful to someone out there!
I was trying to resize some images for a slideshow video and because of that, I wanted not just one max dimension, but a max width and a max height (the size of the video frame).
And there was always the possibility of a portrait video.
The Image.thumbnail method was promising, but I could not make it upscale a smaller image.So after I couldn’t find an obvious way to do that here (or at some other places), I wrote this function and put it here for the ones to come: