Ну, искусство есть искусство, не так ли? С другой стороны, вода есть вода! Восток есть восток, а запад есть запад, и если взять клюкву и растолочь ее до консистенции яблочного соуса, то по вкусу она будет напоминать чернослив, а не ревень.
Граучо Маркс
В этой и двух следующих главах рассказывается о применении Python в наиболее распространенных областях деятельности человека: искусстве, бизнесе и науке. Если вас интересует одна из указанных областей, то можете почерпнуть из этих глав несколько идей или они подтолкнут вас попробовать что-то новое.
Все языки программирования в какой-то степени работают с компьютерной графикой. Многие мощные платформы в этом приложении в целях быстродействия были написаны на С или С++, но для продуктивности добавлены библиотеки Python. Начнем с рассмотрения некоторых библиотек для работы с двумерными изображениями.
В стандартной библиотеке содержатся всего несколько модулей, связанных с изображениями. Рассмотрим два из них:
•imghdr — этот модуль определяет тип некоторых файлов изображений;
•colorsys — этот модуль преобразует цвета между разными системами: RGB, YIQ, HSV и HLS.
Если вы загрузили логотип издательства O’Reilly и сохранили его под именем oreilly.png, то можете запустить этот код:
>>> import imghdr
>>> imghdr.what('oreilly.png')
'png'
Еще одна стандартная библиотека называется turtle (), она иногда используется для обучения молодых людей программированию. Вы можете запустить демонстрацию с помощью следующей команды:
$ python -m turtledemo
На рис. 20.1 показан снимок экрана, на котором демонстрируется пример розетки.
Рис. 20.1. Изображение из turtledemo
Чтобы сделать с графикой в Python нечто серьезное, нужно загрузить сторонние пакеты. Рассмотрим их.
Многие годы библиотека изображений Python (Python Image Library, PIL) (), несмотря на ее отсутствие в стандартной библиотеке, является самой известной библиотекой для обработки двумерных изображений. Она предшествовала таким установщикам, как pip, поэтому был создан «дружественный форк» с названием Pillow (/). Код для работы с изображениями Pillow совместим с кодом PIL, а его документация хороша, поэтому используем его здесь.
Установить его просто — достаточно ввести следующую команду:
$ pip install Pillow
Если вы уже устанавливали пакеты libjpeg, libfreetype и zlib, то они будут обнаружены и использованы Pillow. На странице с инструкциями по установке () вы узнаете больше.
Откроем файл изображения:
>>> from PIL import Image
>>> img = Image.open('oreilly.png')
>>> img.format
'PNG'
>>> img.size
(154, 141)
>>> img.mode
'RGB'
Хоть пакет и называется Pillow, вы импортируете его как PIL, чтобы код был совместим со старым PIL.
Чтобы отобразить изображение на экране с помощью метода show() объекта Image, вы сначала должны установить пакет ImageMagick, описанный в следующем подразделе, а затем попробовать вот что:
>>> img.show()
Изображение, показанное на рис. 20.2, открывается в другом окне. (Этот снимок экрана был сделан на компьютере Mac, где функция show() используется для приложения предварительного просмотра изображений. Отображение ваших окон может быть иным.)
Рис. 20.2. Изображение, полученное с помощью библиотеки изображений Python
Обрежем изображение в памяти, сохраним результат как новый объект с именем img2 и отобразим его. Изображения всегда измеряются в горизонтальных (х) и вертикальных (у) значениях. Один из углов изображения называется стартовой точкой (origin), его значения х и у равны 0. В этой библиотеке origin (0, 0) находится в левом верхнем углу изображения, х увеличивается при смещении вправо, а у — при смещении вниз. Мы хотим задать значения левого края х (55), верхнего края у (70), правого края х (85) и нижнего края у (100) для метода crop(), поэтому передаем кортеж, содержащий эти значения в соответствующем порядке:
>>> crop = (55, 70, 85, 100)
>>> img2 = img.crop(crop)
>>> img2.show()
Результат показан на рис. 20.3.
Рис. 20.3. Обрезанное изображение
Сохраним изображение с помощью метода save(). Он принимает имя файла и опциональный путь. Если у имени файла есть суффикс, то библиотека использует его, чтобы определить тип. Но вы также можете указать тип файла явно. Сохранить изображение с расширением GIF можно, проделав следующее:
>>> img2.save('cropped.gif', 'GIF')
>>> img3 = Image.open('cropped.gif')
>>> img3.format
'GIF'
>>> img3.size
(30, 30)
В качестве последнего примера «улучшим» наш маленький талисман. Сначала загрузим копию исходного изображения нашего зверька, показанную на рис. 20.4.
Рис. 20.4. Наш милый зверек
У него какая-то неопрятная тень, повернутая на пять часов, поэтому найдем изображение, которое позволит улучшить его образ (рис. 20.5).
Рис. 20.5. Инопланетная технология
Объединим их, используя магию альфа-канала, чтобы сделать пересечение полупрозрачным, как показано в примере 20.1.
Пример 20.1. ch20_critter.py
from PIL import Image
critter = Image.open('ch20_critter.png')
stache = Image.open('ch20_stache.png')
stache.putalpha(100)
img = Image.new('RGBA', critter.size, (255, 255, 255, 0))
img.paste(critter, (0, 0))
img.paste(stache, (45, 90), mask=stache)
img.show()
На рис. 20.6 показан новый образ зверька.
Рис. 20.6. Наш новый, более опрятный талисман
ImageMagick (/) — это комплект программ для конвертирования, изменения и отображения двумерных изображений. Он существует более 20 лет. Различные библиотеки Python подключены к библиотеке ImageMagick, написанной на С. Самая недавняя из них, поддерживающая Python 3, называется wand (/). Чтобы установить ее, введите следующую команду:
$ pip install Wand
Библиотека wand позволяет делать примерно то же, что и Pillow:
>>> from wand.image import Image
>>> from wand.display import display
>>>
>>> img = Image(filename='oreilly.png')
>>> img.size
(154, 141)
>>> img.format
'PNG'
Как и в случае с Pillow, эта строка отобразит изображение на экране:
>>> display(img)
Благодаря wand можно поворачивать изображение, изменять его размер, писать текст, рисовать линии и многое другое, что вы можете найти и в Pillow. Оба этих пакета имеют хорошие API и документацию.
Для работы с трехмерной графикой в Python существуют следующие пакеты:
• VPython (/) содержит примеры (), которые вы можете запустить в своем браузере;
• pi3d (/) работает на базе Raspberry Pi, Windows, Linux и Android;
• Open3D () — это полноценная библиотека для работы с трехмерной графикой.
Посмотрите длинные финальные титры любого современного фильма, и вы увидите огромное количество людей, занимавшихся спецэффектами и анимацией. Большинство крупных студий: Walt Disney Animation, ILM, Weta, Dreamworks, Pixar — нанимают людей, имеющих опыт работы с Python. Поищите в Интернете «python анимация работа», чтобы увидеть действующие предложения.
Далее показаны некоторые пакеты Python для работы с 3D.
• Panda3D (/) — этот пакет имеет открытый исходный код, и его можно использовать бесплатно даже для создания коммерческих приложений. Вы можете скачать его версию с сайта Panda3D ().
• VPython (/) — поставляется с большим количеством примеров ().
• Blender (/) — это бесплатное средство создания 3D-анимации и игр. Если вы скачаете и установите его (), то на ваш компьютер также будет установлена копия Python 3.
• Maya (-) — это коммерческая система для создания 3D-анимации и графики. Она поставляется вместе с версией Python — в данный момент Python 2.7. Чед Вернон написал о ней бесплатно загружаемую книгу Python Scripting for Maya Artists (). Если вы поищете в Интернете информацию о Python и Maya, то сможете найти множество других ресурсов, как бесплатных, так и коммерческих, включая видеоролики.
• Houdini (/) — это коммерческий пакет, однако вы можете скачать бесплатную версию, которая называется Apprentice. Как и другие пакеты для анимации, он поставляется с привязкой к Python ().
Название содержит слово «графический», но GUI (Graphical User Interface) концентрируется скорее на пользовательском интерфейсе: виджетах для представления данных, методах ввода, меню, кнопках и окнах.
Страница «Википедии» GUI programming () и список часто задаваемых вопросов () содержат множество примеров GUI, созданных с помощью Python. Начнем с единственного встроенного в стандартную библиотеку примера — Tkinter (). Он прост, но работает на всех платформах и создает естественно выглядящие окна и виджеты.
Рассмотрим небольшую программу, в которой используется Tkinter. Она отображает наш любимый талисман в отдельном окне:
>>> import tkinter
>>> from PIL import Image, ImageTk
>>>
>>> main = tkinter.Tk()
>>> img = Image.open('oreilly.png')
>>> tkimg = ImageTk.PhotoImage(img)
>>> tkinter.Label(main, image=tkimg).pack()
>>> main.mainloop()
Обратите внимание: мы использовали некоторые модули PIL/Pillow. Вы снова должны увидеть логотип издательства O’Reilly, как показано на рис. 20.7.
Рис. 20.7. Изображение, показанное с помощью библиотеки Tkinter
Чтобы окно пропало, нажмите кнопку Close (Закрыть) или выйдите из интерпретатора Python.
О библиотеке Tkinker вы можете прочитать в tkinter wiki (). Теперь поговорим о GUI, которые не входят в стандартную библиотеку.
•Qt (/). Это профессиональный инструментарий для создания GUI и приложений, созданный около 20 лет назад норвежской компанией Trolltech. Использовался для создания таких приложений, как Google Earth, Maya и Skype. Кроме того, применен как основа для KDE, графической оболочки Linux. Для Qt существуют две основные библиотеки, работающие с Python: PySide () бесплатна (по лицензии LGPL), а PyQt () лицензирована либо с GPL, либо коммерчески. Пользователи Qt видят разницу (). Скачать PySide можно с сайтов PyPI () или Qt (), а также прочесть руководство (). Скачать Qt бесплатно можно здесь: .
• GTK+ (/). Соперник Qt, также был использован для создания множества приложений, таких как GIMP и оболочки Gnome для Linux. Для Python используется PyGTK (/). Чтобы скачать код, перейдите на сайт PyGTK (), где также можете прочитать документацию ().
• WxPython (/). Это привязка Python к WxWidgets (/), представляющему еще один крупный пакет, который можно бесплатно скачать онлайн ().
• Kivy (/). Это бесплатная современная библиотека для создания мультимедийных интерфейсов пользователя, которые можно переносить на другие платформы: стационарные (Windows, OS X, Linux) и мобильные (Android, iOS). Включает поддержку мультитача. Вы можете скачать ее для всех платформ с сайта Kivy (). Библиотека содержит руководства по разработке приложений ().
• PySimpleGUI (/). Создайте нативный или основанный на веб интерфейс с помощью одной библиотеки. PySimpleGUI представляет собой оболочку для других интерфейсов, упомянутых в этом разделе, включая Tk, Kivy и Qt.
•The Web. Такие фреймворки, как Qt, используют встроенные компоненты, но некоторые другие программы применяют Web. Это универсальный GUI, содержащий графику (SVG), текст (HTML) и даже мультимедиа (в HTML5). Вы можете создать веб-приложения с любой комбинацией фронтенда (клиентской части) и бэкенда (машинного интерфейса) инструментов. Тонкийклиент позволяет бэкенду делать всю работу. Если доминирует фронтенд, то клиент называется толстым или насыщенным; последний эпитет звучит более льстиво. Части приложения могут общаться друг с другом с помощью RESTful API, AJAX и JSON.
Python — отличный инструмент для создания диаграмм, графиков и визуализации данных и особенно популярен в научной среде (см. главу 22). Полезные обзоры с примерами встречаются в официальной Python wiki () и Python Graph Gallery (/).
Рассмотрим самые популярные. В следующей главе вы снова увидите некоторые из них, но они будут использованы для создания карт.
Бесплатную библиотеку для создания двумерных диаграмм Matplotlib (/) можно установить с помощью следующей команды:
$ pip install matplotlib
Примеры из галереи () показывают широту этой библиотеки.
Попробуем написать такое же приложение для показа изображений (результаты можно увидеть на рис. 20.8) только для того, чтобы увидеть, как будут выглядеть код и презентация:
import matplotlib.pyplot as plot
import matplotlib.image as image
img = image.imread('oreilly.png')
plot.imshow(img)
plot.show()
Реальная мощь Matplotlib заключается в построении графиков (plotting), что в целом понятно по средней части ее названия. Создадим два списка, каждый из которых включает по 20 целых чисел. В один из них войдут числа, плавно увеличивающиеся от 1 до 20, а второй будет похож на первый, но с небольшими отклонениями там и тут (пример 20.2).
Рис. 20.8. Изображение, показанное с помощью библиотеки Matplotlib
Пример 20.2. ch20_matplotlib.py
import matplotlib.pyplot as plt
from random import randint
linear = list(range(1, 21))
wiggly = list(num + randint(-1, 1) for num in linear)
fig, plots = plt.subplots(nrows=1, ncols=3)
ticks = list(range(0, 21, 5))
for plot in plots:
plot.set_xticks(ticks)
plot.set_yticks(ticks)
plots[0].scatter(linear, wiggly)
plots[1].plot(linear, wiggly)
plots[2].plot(linear, wiggly, 'o-')
plt.show()
Если вы запустите эту программу, то получите результат, похожий на тот, что представлен на рис. 20.9 (он не будет полностью идентичен, поскольку каждый вызов функции randint() возвращает новый результат).
Рис. 20.9. Базовые графики Matplotlib (диаграмма рассеивания и линейные графики)
В этом примере показаны диаграмма рассеивания, линейный график и линейный график с отметками. При их создании были использованы стили по умолчанию, но внешний вид графиков можно изменять. Для получения более подробной информации обратитесь к сайту Matplotlib (/) или к обзору, например Python Plotting With Matplotlib (Guide) ().
В главе 22 мы еще вернемся к Matplotlib — она тесно связана с NumPy и другими научными приложениями.
Seaborn (/) — это библиотека для визуализации данных (рис. 20.10), построенная на основе Matplotlib и имеющая соединение с Pandas. Для нее работает базовая мантра инсталляции (pipinstallseaborn).
Рис. 20.10. Базовая диаграмма рассеивания и прямолинейная регрессия в Seaborn
Код, показанный в примере 20.3, основан на примере использования Seaborn (); он получает доступ к тестовым данным о чаевых в ресторане и строит график зависимости чаевых от общей суммы счета, добавляя прямолинейную регрессию.
Пример 20.3. ch20_seaborn.py
import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset("tips")
sns.regplot(x="total_bill", y="tip", data=tips);
plt.show()
При запуске данного кода с помощью стандартного интерпретатора Python вам понадобится указать первую строку импорта (import matplotlib.pyplot as plt) и последнюю строку (plt.show()), как показано в примере 20.3, иначе график не отобразится. Если вы используете Jupyter, то библиотека Matplotlib уже встроена в среду — нет необходимости ее импортировать. Помните это, когда будете исследовать примеры кода, работающего с инструментами построения карт в Python.
Как и Matplotlib, Seaborn предоставляет широкий спектр возможностей по обработке и отображению данных.
На заре существования Интернета разработчики генерировали графику на сервере и давали браузеру URL для доступа к ней. С недавних пор JavaScript повысил свою производительность и получил инструменты генерации графики на стороне клиента, такие как D3. Пару страниц назад я говорил о возможности использовать Python как часть архитектуры фронтенд-бэкенд-графики и GUIs. Новый инструмент, который называется Bokeh (/), совмещает плюсы Python (крупные наборы данных, простота использования) и JavaScript (интерактивность, меньшая латентность графики). Bokeh делает акцент на быстрой визуализации крупных наборов данных.
Если вы уже установили необходимые для Bokeh пакеты (NumPy, Pandas и Redis), то можете установить и сам этот инструмент, введя следующую команду:
$ pip install bokeh
(NumPy и Pandas в действии вы сможете увидеть в главе 22.)
Или же можете установить все сразу с сайта Bokeh (). Несмотря на то что на сервере запущен Matplotlib, Bokeh в основном работает в браузере и может пользоваться всеми новыми возможностями клиентской стороны. Нажмите любое изображение в галерее (), чтобы получить интерактивное представление дисплея и его код Python.
Оказывается, Python — настолько хорошая платформа для написания игр, что об этом пишут книги, например:
•Invent Your Own Computer Games with Python, автор Эл Свайгарт (/);
•The Python Game Book, автор Хорст Йенс (книга в формате docuwiki) (/).
В Python wiki () вы можете найти статью, в которой содержится еще большее количество ссылок.
Самая известная платформа для написания игр, скорее всего, pygame (/). Вы можете скачать исполняемый установщик для своей платформы с сайта Pygame () и прочесть построчный пример создания игры ().
I sought the serif
But that did not suit Claude Debussy.
Deservedly Anonymous
Что насчет звука, музыки и котов, которые поют Jingle Bells? Ну, как говорит Meatloaf, два из трех — это не так плохо.
В напечатанной книге звук представить сложно, так что взгляните на эти актуальные ссылки на пакеты Python, предназначенные для работы со звуком и музыкой. С помощью Google вы можете найти намного больше:
• модули стандартной библиотеки для работы с аудио ();
• сторонние инструменты для работы с аудио ();
• десятки сторонних музыкальных () приложений: графические и CLI-проигрыватели, преобразователи, нотации, анализ, плейлисты, MIDI и др.
Наконец, как насчет онлайн-источников музыки? На протяжении этой книги вы видели примеры кода, которые получали доступ к Internet Archive. Вот ссылки на некоторые из аудио-архивов:
• аудиозаписи () (> 5 000 000);
• живая музыка () (> 200 000);
• живые концерты группы Grateful Dead () (> 13 000).
Имитируем бурную деятельность! В дело вступает Python.
20.1. Установите matplotlib. Нарисуйте диаграмму рассеивания для следующих пар (x,y): ((0,0), (3,5), (6,2), (9,8), (14,10)).
20.2. Нарисуйте линейчатый график на основе тех же данных.
20.3. Нарисуйте график на основе тех же данных.
Свайгарт Эл. Учим Python, делая крутые игры. — М.: Эксмо, 2017.
Обыгрывается строка из песни I shot the Sheriff. — Примеч. пер.