Python Imaging Library PIL Библиотека для работы с изображениями в Python Обзор применений библиотеки Image Archives PIL идеально подходит для архивных изображений и приложений пакетной обработки. Можно использовать библиотеку для создания эскизов, печати изображений и т.д. Image Display Для отладки существует show method, который сохраняет изображения на диск и призывает внешние утилиты просмотров 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 format (например, GIF, JPEG) mode (P, RGB, CMYK) 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, img2.save("screen2.bmp", "BMP") img2.size (200, 200) 300)) Спасибо за внимание!