- Меняем размер изображения в Python Pillow с обрезанием и изменением ширины и высоты
- Получение размеров
- Изменение размера изображения с resize()
- Учет соотношения сторон
- Создание эскиза thumbnail
- Обрезание (cropping) картинки
- Создание границ картинки и ее увеличение за счет новой области
- Создание границ изображения с ImageOps.expand
- Получение и изменение размера изображения в Python
- Синтаксис
- Пример 1
- Пример 2: доступ к ширине и высоте
- Изменение размера изображения
- Синтаксис
- Пример 1: со значениями по умолчанию
- Пример 2: с помощью поля входного изображения
Меняем размер изображения в Python Pillow с обрезанием и изменением ширины и высоты
В Python есть много библиотек по работе с изображениями. Одна из самых известных библиотек — Pillow (ранее PIL). В этой статье будут рассмотрены примеры по изменению размеров картинки с помощью увеличения и уменьшения картинки, а так же обрезания.
Pillow не является стандартной библиотекой и устанавливается отдельно:
Получение размеров
Для получения размера картинки мы должны открыть ее (создать объект класса Image) и получить атрибут ‘size’. Это можно сделать так:
from PIL import Image image_path = 'F:/hello.png' img = Image.open(image_path) # получаем ширину и высоту width, height = img.size print(width, height) # открываем картинку в окне img.show()
Изменение размера изображения с resize()
Для изменения ширины и высоты есть метод ‘resize’. Этот метод не изменяет текущую картинку, а возвращает новую. Новый размер мы должны указать в виде кортежа ‘(ширина, высота)’. Сохранить картинку можно через метод ‘save’:
from PIL import Image image_path = 'F:/hello.png' img = Image.open(image_path) # изменяем размер new_image = img.resize((200, 385)) new_image.show() # сохранение картинки new_image.save('F:/hello2.png')
На примере выше видно, что картинка меняется не пропорционально. Это можно изменить двумя способами:
Учет соотношения сторон
Что бы создать пропорциональную картинку вам нужно определиться с размером одно из сторон. В примере ниже указана фиксированная ширина, но вы можете немного изменить скрипт и указать высоту. Мы должны вычислить процентное соотношение старой ширины к новой, а затем умножить ее на высоту:
from PIL import Image image_path = 'F:/hello.png' # указываем фиксированный размер стороны fixed_width = 200 img = Image.open(image_path) # получаем процентное соотношение # старой и новой ширины width_percent = (fixed_width / float(img.size[0])) # на основе предыдущего значения # вычисляем новую высоту height_size = int((float(img.size[0]) * float(width_percent))) # меняем размер на полученные значения new_image = img.resize((fixed_width, height_size)) new_image.show() new_image.save('F:/hello2.png')
Создание эскиза thumbnail
Есть еще один способ выполнить предыдущие шаги автоматически — он называется ‘thumbnail’. Его отличие от resize() в том, что он не может увеличить размер изображения. Если с помощью resize() вы можете изменить размер 200х200 на 400х400, то метод thumbnail() оставит исходный.
В методе ‘thumbnail()’ создается кортеж с 2-мя числами: максимальная ширина и высота. Понятие «максимальный» нужно оценивать как значение, которое можно менять в меньшую сторону. Если вы возьмете картинку размером 100х100 и захотите ее уменьшить до 100х50, то Pillow высчитает оптимальны размер как 50х50.
from PIL import Image image_path = 'F:/hello.png' img = Image.open(image_path) # пропорциональное изменение картинки img.thumbnail(size=(350,400)) img.show() img.save('F:/hello3.png')
Обрезание (cropping) картинки
Для обрезания ненужных частей картинки используется метод ‘crop()’. Внутри этого метода помещается кортеж со значениями (отступами) соответствующие сторонам, которые нужно обрезать. Стороны можно определить следующими переменными:
Оси x1 и y1 находятся в левой верхней части изображения, а оси x2 и y2 в правой нижней. Левая верхняя часть имеет координаты 0 и 0, а правая нижняя соответствует ширине и высоте изображения. Картинка, которую я использовал в предыдущих примерах, имеет размер 401х385. Если распределить все координаты, соответствующие этой картинке, получится следующий результат:
Представим, что нам нужно обрезать название на картинке — это примерно 60px. Мы должны вычесть (вырезать) это значение из нижнего правого угла (высоты):
from PIL import Image image_path = 'F:/hello.png' img = Image.open(image_path) size = img.size width, height = img.size # обрезаем картинку new_image = img.crop((0,0,width,height-60)) new_image.show() new_image.save('F:/hello3.png')
Если бы мы хотели оставить только название, то нужно было бы изменить значение y1 (2-ой индекс):
Создание границ картинки и ее увеличение за счет новой области
Увеличить размер изображения, не растягивая ее (как делает resize()), можно тремя методами.
Первый, который так же обсуждался в предыдущей части статьи, увеличит изображение без возможности изменения фона (в зависимости от изображения он может быть черным/прозрачным). В примере ниже мы добавим по 50px к каждому углу:
Второй способ — за счет создания нового изображения и вставки в него старого.
Для создания нового изображения нужно использовать метод ‘Image.new()’. В этом методе мы должны указать тип картинки, ее ширину и высоту, а так же цвет. Что бы вставить изображение — используется метод ‘paste()’. В нем указывается отступ формата ‘(верх, лево)’ либо вы можете использовать координаты аналогичные методу ‘crop()’.
В следующем примере мы создадим изображение, которое будет на 50px больше и вставим в него старую картинку. Картинка будет располагаться в 25px от верхнего и левого края:
from PIL import Image image_path = 'F:/hello.png' old_img = Image.open(image_path) # создание нового изображения new_image = Image.new(old_img.mode, (old_img.size[0]+50, old_img.size[1]+50), 'white') # вставляем старой изображение в новое new_image.paste(old_img, (25, 25)) new_image.show() new_image.save('F:/hello3.png')
Создание границ изображения с ImageOps.expand
Создать границы картинки (расширить) так же можно через метод ImageOps.expand(). Вообще через модуль ‘ImageOps’ можно проделать все шаги описанные выше, но он может не работать с какими-то типами изображений.
В метод ‘expand()’ мы должны передать объект ‘Image’, размер границы и цвет. Пример с результатом аналогичным предыдущему:
from PIL import Image from PIL import ImageOps image_path = 'F:/hello.png' old_img = Image.open(image_path) # создание нового изображения с белым фоном new_image = ImageOps.expand(old_img, border=25, fill=(255,255,255)) new_image.show() new_image.save('F:/hello3.png')
Получение и изменение размера изображения в Python
Чтобы получить размер изображения с помощью Pillow в Python, используйте свойство size объекта Image. Свойство size возвращает ширину и высоту изображения.
В этом уроке мы узнаем, как получить размер изображения, другими словами, ширину и высоту изображения, используя библиотеку Pillow.
Синтаксис
Синтаксис для использования свойства size объекта PIL Image приведен ниже.
im = Image.open("sample-image.png") im.size
Пример 1
В следующей программе мы будем читать и изображать, а затем распечатывать его размер, используя свойство size объекта Image.
from PIL import Image #read the image im = Image.open("sample-image.png") #image size print(im.size)
Пример 2: доступ к ширине и высоте
Вы можете получить доступ к высоте и ширине из свойства size, используя index. В следующем примере мы получим ширину и высоту изображения.
from PIL import Image #read the image im = Image.open("sample-image.png") #image size width = im.size[0] height = im.size[1] print('Width of the image is:', width) print('Height of the image is:', height)
Width of the image is: 640 Height of the image is: 400
В этом руководстве на примерах Python мы узнали, как получить размер изображения с помощью библиотеки Python Pillow с помощью хорошо подробных примеров программ.
Изменение размера изображения
Чтобы изменить размер изображения с помощью Pillow, вы можете использовать метод resize() класса PIL.Image.Image. Вы можете передать такие параметры, как размер результирующего изображения, фильтр передискретизации пикселей и область блока источника, которую необходимо учитывать.
Синтаксис
Синтаксис метода resize() показан в следующем фрагменте кода.
Image.resize(size, resample=0, box=None)
- size передается, как кортеж (ширина, высота). Это размер, запрошенный для результирующего выходного изображения после изменения размера.
- resample – это фильтр, который должен использоваться для повторной выборки, это необязательно. Вы можете пройти:
- PIL.Image.NEAREST;
- PIL.Image.BOX;
- PIL.Image.BILINEAR;
- PIL.Image.HAMMING;
- PIL.Image.BICUBIC;
- PIL.Image.LANCZOS.
Если для параметра размера заданы правильные значения, вы можете уменьшить или увеличить входное изображение.
Пример 1: со значениями по умолчанию
В следующем примере мы прочитаем изображение и изменим его размер до (200, 200).
from PIL import Image #read the image im = Image.open("sample-image.png") #image size size=(200,200) #resize image out = im.resize(size) #save resized image out.save('resize-output.png')
Для изменения размера рассматривается все исходное изображение, поскольку мы не предоставили никакого значения для параметра box. В следующем примере мы предоставим параметр box и найдем выходное изображение.
Пример 2: с помощью поля входного изображения
В следующем примере мы предоставим параметр box. При этом мы рассматриваем только область поля входного изображения, а затем изменяем его размер до нужного размера.
from PIL import Image #read the image im = Image.open("sample-image.png") #image size size = (200,200) box = (100,100,500,400) #resize image out = im.resize(size, box=box) #save resized image out.save('resize-output.png')
Если вы заметили, для действия изменения размера учитывается только прямоугольная часть входного изображения.
В этом руководстве на примерах Python мы узнали, как изменить размер изображения с помощью библиотеки PIL.