Python Imaging Library PIL Библиотека для работы с изображениями в Python
Обзор применений библиотеки Image Archives Image Archives PIL идеально подходит для архивных изображений и приложений пакетной обработки. Можно использовать библиотеку для создания эскизов, печати изображений и т. д. Image Display Image Display Для отладки существует show method, который сохраняет изображения на диск и призывает внешние утилиты просмотров Image Processing Image Processing Библиотека содержит базовые функции обработки изображений, в том числе цветовых преобразований пространства, изменение размера изображения, вращение и произвольных аффинных преобразований
Загрузка готового изображения open() open( [, mode = r]) Откроем файл foto.gif, расположенный в текущем рабочем каталоге : img = Image.open("foto.gif")
Вместо указания пути к файлу можно передать файловый объект, открытый в бинарном рижиме : # Открываем файл в бинарном режиме f = open("foto.gif", "rb") # Передаем объект файла img = Image.open(f) # Получаем размер изображения img.size (800, 600) f.close() # Закрываем файл
Загрузка изображения из строки : Загрузка изображения из строки : Модуль StringIO # Открываем файл в бинарном режиме f = open("foto.gif", "rb") # Сохраняем изображение в переменной i = f.read() f.close() # Закрываем файл # Подключаем модуль StringIO import StringIO # Передаем объект img = Image.open(StringIO.StringIO(i)) img.format # Выводим формат изображения 'GIF'
Получение и изменение цвета пиксела : Получение и изменение цвета пиксела : load() img = Image.open("foto.jpg") obj = img.load() obj[25, 45] # Получаем цвет пикселя (122, 86, 62) # Задаем цвет пикселя (красный) obj[25, 45] = (255, 0, 0)
Использование методов и Использование методов getpixel() и putpixel() img = Image.open("foto.jpg") # Получаем цвет пикселя img.getpixel ((25, 45)) (122, 86, 62) # Изменяем цвет пикселя img.putpixel ((25, 45), (255, 0, 0)) # Получаем цвет пикселя img.getpixel ((25, 45)) (255, 0, 0) img.show() # Просматриваем изображение
Сохранение изображения Сохранение изображения save() # В формате JPEG img.save("tmp.jpg") # В формате BMP img.save("tmp.bmp", "BMP") f = open("tmp2.bmp", "wb") # Передаем файловый объект img.save(f, "BMP") f.close()
Создание нового изображения new () new(, [, ]) : : 1 – 1 бит, черно - белое L – 8 бит, черно - белое P – 8 бит, цветное (256 цветов ) RGB – 24 бита, цветное RGBA – 32 бита, цветное с альфа - каналом CMYK – 32 бита, цветное YCbCr – 24 бита, цветное, видеоформат I – 32 бита, целое число, цветное F - 32 бита, вещественное число, цветное
: : (, ) : : img = Image.new("RGB", (100, 100)) img.show() # Черный квадрат img = Image.new("RGB", (100, 100), (255, 0, 0)) img.show() # Красный квадрат img = Image.new("RGB", (100, 100), "green") img.show() # Зеленый квадрат img = Image.new("RGB", (100, 100), "#f00") img.show() # Красный квадрат
Получение информации об изображении - позволяют следующие атрибуты : size size format format ( например, GIF, JPEG) mode mode (P, RGB, CMYK) info info
Манипулирование изображением copy() from PIL import Image # Подключаем модуль img = Image.open("foto.jpg") # Открываем файл img2 = img.copy() # Создаем копию img2.show() # Просматриваем копию
thumbnail() - создает уменьшенную версию изображения указанного размера thumbnail ( [, ]) Image.open("foto.jpg") img.size # Исходные размеры изображения (800, 600) img.thumbnail((400, 300), Image.ANTIALIAS) img.size # Изменяется само изображение (400, 300) img = Image.open("foto.jpg") img.thumbnail((400, 100), Image.ANTIALIAS) img.size # Размер изменяется пропорционально (133, 100) Фильтры NEAREST, BILINEAR, BICUBIC или ANTIALIAS
rotate() rotate( [, ] [, expand=0] ) img = Image.open("foto.jpg") img.size # Исходные размеры изображения (800, 600) img2 = img.rotate(90)# Поворот на 90 градусов img2.size (600, 800) img3 = img.rotate(45, Image.NEAREST) img3.size # Размеры сохранены, изображение обрезано (800, 600) img4 = img.rotate(45, expand=True) img4.size # Размеры увеличены, изображение полное (991, 990)
paste() paste(, [, ]) # Закрасим область красным цветом img = Image.open("foto.jpg") img.paste( (255, 0, 0), (0, 0, 100, 100) ) img.show() # Зальем все изображение зеленым цветом img = Image.open("foto.jpg") img.paste( (0, 128, 0), img.getbbox() ) img.show() getbbox() img.getbbox() (0, 0, 800, 600)
convert() img = Image.open("foto.jpg") img.mode 'RGB' img2 = img.convert("RGBA") img2.mode 'RGBA' img2.show()
Рисование линий и фигур Чтобы на изображении можно было рисовать, необходимо создать экземпляр класса Draw: # Подключаем модули from PIL import Image, ImageDraw img = Image.new ("RGB", (300, 300), (255, 255, 255)) # Создаем экземпляр класса draw = ImageDraw.Draw(img)
Класс Draw предоставляет следующие методы : point – рисует точку from PIL import Image, ImageDraw img = Image.new ("RGB", (300, 300), (255, 255, 255)) draw = ImageDraw.Draw(img) for n in xrange (5, 31): draw.point ( (n, 5), fill=(255, 0, 0) ) img.show()
line – рисует линию между двумя координатами draw.line ( (0, 0, 0, 300), fill=(0, 128, 0) ) draw.line ( (297, 0, 297, 300), fill=(0, 128, 0), width=3 ) img.show()
rectangle - рисует прямоугольник draw.rectangle ( (10, 10, 30, 30), fill=(0, 0, 255), outline=(0, 0, 0) ) draw.rectangle ( (40, 10, 60, 30), fill=(0, 0, 128)) draw.rectangle ( (0, 0, 299, 299), outline=(0, 0, 0)) img.show()
polygon - рисует многоугольник draw.polygon ((50, 50, 150, 150, 50, 150), outline=(0,0,0), fill=(255, 0, 0)) # Треугольник draw.polygon ( (200, 200, 250, 200, 275, 250, 250, 300, 200, 300, 175, 250), fill=(255, 255, 0)) img.show()
ellipse – рисует эллипс draw.ellipse ((100, 100, 200, 200), fill=(255, 255, 0)) draw.ellipse ((50, 170, 150, 300), outline=(0, 255, 255)) img.show()
Модуль aggdraw Если приглядеться к контурам фигур, созданных с помощью класса ImageDraw, то можно заметить, что граница отображается в виде ступенек. Сделать контуры более гладкими позволяет модуль aggdraw.
Сравнение класса ImageDraw и модуля aggdraw import aggdraw from PIL import Image, ImageDraw img = Image.new ("RGB", (300, 300), (255, 255, 255)) draw = ImageDraw.Draw(img) draw.ellipse ((0, 0, 150, 150), fill="red", outline="red") pen = aggdraw.Pen ("red", 0.5) brush = aggdraw.Brush ("red") draw2 = aggdraw.Draw(img) draw2.ellipse ((150, 150, 300, 300), pen, brush) draw2.flush() img.show()
Pen ( [, width=1] [, opacity=255]) - перо используется для вывода границы фигуры Brush ( [, opacity=255]) - кисть применяется для заливки
Класс Draw из модуля aggdraw предоставляет следующие методы : setantialias( ), flush() img = Image.new("RGB", (300, 300), (255, 255, 255)) draw = aggdraw.Draw(img) pen = aggdraw.Pen((255, 0, 0), 0.5) brush = aggdraw.Brush("#ff0000") draw.setantialias(False)# Сглаживание отключено draw.ellipse((0, 0, 150, 150), pen, brush) draw.setantialias(True)# Сглаживание включено draw.ellipse((150, 150, 300, 300), pen, brush) draw.flush() # Обновляем изображение img.show()
rectangle (,, ) pen = aggdraw.Pen("#000000") brush = aggdraw.Brush("orange") draw.rectangle ((40, 10, 60, 30), pen, brush) draw.rectangle ((0, 0, 299, 299), pen) draw.flush() img.show()
Вывод текста на изображение text (,, fill=, font= ) из модуля ImageDraw from PIL import Image, ImageDraw, ImageFont img = Image.new ("RGB", (300, 300), (255, 255, 255)) draw = ImageDraw.Draw(img) font = ImageFont.load_default() draw.text ((10, 10), "Hello", font=font, fill="red") img.show()
text (,, ) из модуля aggdraw Для создания объекта шрифта предназначена функция : Font(, [, size=12[, opacity=255] ])
import aggdraw from PIL import Image img = Image.new ("RGB", (300, 300), (255, 255, 255)) draw = aggdraw.Draw(img) font_file = r"C:\WINDOWS\Fonts\arial.ttf" font = aggdraw.Font ("red", font_file, size=24) txt = unicode ("Привет мир", "cp1251") draw.text ((10, 10), txt, font) draw.flush() img.show()
Создание скриншотов Библиотека PIL позволяет сделать снимок экрана ( скриншот ) можно получить как полную копию экрана, так и копию определенной прямоугольной области grab ([ ]) из модуля ImageGrab
from PIL import Image, ImageGrab img = ImageGrab.grab() img.save ("screen.bmp", "BMP") img.mode 'RGB' img2 = ImageGrab.grab ((100, 100, 300, 300)) img2.save ("screen2.bmp", "BMP") img2.size (200, 200)
Спасибо за внимание !