Простой Python — страница 47 из 66

Но погодите, это еще не конец! В приложениях А, Б и В вы можете познакомиться с использованием Python в искусстве, бизнесе и науке. Вы найдете как минимум одну область для исследований.

В Сети можно отыскать множество блестящих объектов. Только вы сможете сказать, какие из них являются бижутерией, а какие — серебряными пулями. И даже если вас в данный момент не преследуют оборотни, серебряные пули могут пригодиться. На всякий случай.

Наконец, вы узнаете ответы на все эти раздражающие упражнения в конце каждой главы, детали установки Python и его друзей, а также получите несколько вспомогательных таблиц для вещей, которые мне всегда нужно подглядывать. Ваш мозг, скорее всего, лучше подготовлен, но так они всегда будут под рукой.

Приложение A. Пи-Арт

Ну, искусство есть искусство, не так ли? С другой стороны, вода есть вода! Восток есть восток, а запад есть запад, и если взять клюкву и растолочь ее до консистенции яблочного соуса, то по вкусу она будет напоминать сливы, не то что толченый ревень.

Граучо Маркс

Возможно, вы художник или музыкант. Или, может быть, просто хотите попробовать что-то креативное, выходящее за рамки привычной деятельности.

В первых трех приложениях рассказывается о наиболее распространенных областях деятельности человека с использованием Python. Если вас интересует одна из этих областей, вы можете почерпнуть из этих глав несколько идей или они подтолкнут вас попробовать что-то новое.

2D-графика

Все языки программирования в какой-то степени работают с компьютерной графикой. Многие мощные платформы в этом приложении для быстродействия были написаны на С или С++, но для продуктивности добавлены библиотеки Python. Начнем с рассмотрения некоторых библиотек для работы с двухмерными изображениями.

Стандартная библиотека

В стандартной библиотеке содержатся всего несколько модулей, связанных с графикой. Рассмотрим два из них:

• Imghdr. Этот модуль определяет тип некоторых файлов изображений;

• Colorsys. Этот модуль преобразует цвета между разными системами: RGB, YIQ, HSV и HLS.

Если вы загрузили логотип издательства O’Reilly и сохранили его под именем oreilly.png, можете запустить этот код:

>>> import imghdr

>>> imghdr.what('oreilly.png')

'png'

Чтобы сделать с графикой в Python что-то серьезное, нужно загрузить сторонние пакеты. Давайте их рассмотрим.

PIL и Pillow

Многие годы Python Image Library (PIL, библиотека изображений Python) (http://bit.ly/py-image), несмотря на то что ее нет в стандартной библиотеке, является самой известной библиотекой для обработки двухмерных изображений. Она предшествовала установщикам вроде pip, поэтому был создан «дружественный форк» с названием Pillow (http://pillow.readthedocs.org/). Код для работы с изображениями Pillow совместим с кодом PIL, а его документация хороша, поэтому используем его здесь.

Установить его просто — достаточно ввести следующую команду:

$ pip install Pillow

Если вы уже устанавливали пакеты libjpeg, libfreetype и zlib, они будут обнаружены и использованы Pillow. На странице с инструкциями по установке (http://bit.ly/pillow-install) вы узнаете больше.

Откроем файл изображения:

>>> 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()

Изображение, показанное на рис. A.1, открывается в другом окне. (Этот снимок экрана был сделан на компьютере Mac, где функция show() используется для приложения предварительного просмотра изображений. Отображение ваших окон может быть иным.)


Рис. A.1. Изображение, открытое с помощью библиотеки Python


Обрежем изображение в памяти, сохраним результат как новый объект с именем img2 и отобразим его.

Изображения всегда измеряются в горизонтальных (х) и вертикальных (у) значениях, один из углов изображения называется стартовой точкой, его значения х и у равны 0. В этой библиотеке origin(0, 0) находится в левом верхнем углу изображения, х увеличивается при смещении вправо, а у увеличивается при смещении вниз. Мы хотим задать значения левого края х (55), верхнего края у (70), правого края х (85) и нижнего края у (100) для метода crop(), поэтому передаем кортеж, содержащий эти значения в соответствующем порядке:

>>> crop = (55, 70, 85, 100)

>>> img2 = img.crop(crop)

>>> img2.show()

Результат показан на рис. А.2.

Сохраним изображение с помощью метода save(). Он принимает имя файла и опциональный путь. Если имя файла имеет суффикс, библиотека использует его, чтобы определить тип. Но вы также можете указать тип файла явно. Для того чтобы сохранить изображение с расширением GIF, сделайте следующее:

>>> img2.save('cropped.gif', 'GIF')

>>> img3 = Image.open('cropped.gif')

>>> img3.format

'GIF'

>>> img3.size

(30, 30)


Рис. A.2. Обрезанное изображение


«Улучшим» наш маленький талисман. Сначала загрузим изображение усов (http://bit.ly/moustaches-png) и сохраним его в файл moustaches.png. Мы загрузим его, обрежем соответствующим образом, а затем наложим на нашу зверушку:

>>> mustache = Image.open('moustaches.png')

>>> handlebar = mustache.crop((316, 282, 394, 310))

>>> handlebar.size

(78, 28)

>>> img.paste(handlebar, (45, 90))

>>> img.show()

На рис. А.3 показан подходящий результат.


Рис. A.3. Наш новый опрятный талисман


Было бы здорово, если бы фон у картинки с усами был прозрачным. О, вот и упражнение для вас! Если вы хотите этим заняться, поищите информацию о прозрачности (transparency) и альфа-канале (alpha channel) в руководстве в Pillow (http://bit.ly/pil-fork).

ImageMagick

ImageMagick (http://www.imagemagick.org/) — это комплект программ для конвертирования, изменения и отображения двухмерных изображений. Он существует более 20 лет. Различные библиотеки Python подключены к библиотеке ImageMagick, написанной на С. Самая недавняя из них, поддерживающая Python 3, называется wand (http://docs.wand-py.org/). Для того чтобы установить ее, введите следующую команду:

$ 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 и документацию.

Графические пользовательские интерфейсы (Graphical User Interface, GUI)

Название содержит слово «графический», но GUI концентрируется скорее на пользовательском интерфейсе: виджетах для представления данных, методах ввода, меню, кнопках и окнах.

Страница «Википедии» GUI programming (http://bit.ly/gui-program) и список часто задаваемых вопросов (http://bit.ly/gui-faq) содержат множество примеров GUI, созданных с помощью Python. Начнем с единственного встроенного в стандартную библиотеку примера — Tkinter (https://wiki.python.org/moin/TkInter). Он прост, но работает на всех платформах и создает естественно выглядящие окна и виджеты.

Рассмотрим небольшую программу, где используется Tkinter, она отображает наш любимый талисман в отдельном окне:

>>> import tkinter

>>> from PIL import Image, ImageTk

>>>

>>> main = tkinter.Tk()

>>> img = Image.open('oreilly.png')

>