2010-11-23-PIL_v2

advertisement
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))
Спасибо за внимание!
Download