Май 2018

Этот курс закончился

Cписок курсов

Домашнее задание. Генератор обоев рабочего стола

28 июня 2018

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

Проблема

Часто возникает желание установить в качестве обоев рабочего стола какую-то фотографию или рисунок. Однако бывает так, что размер этой картинки не соответствует размерам экрана устройства. Например, картинка слишком маленькая (если такую картинку растягивать на весь экран, её качество упадёт), или у картинки неподходящие пропорции (например, исходная фотография была обрезана, или вообще снята вертикально).

Эйфелева башня, вертикальное изображение
Эйфелева башня (вертикальная фотография)

Обычно в таких случаях картинку просто помещают в центр рабочего стола, а фон вокруг неё закрашивается выбранным цветом рабочего стола. Это выглядит не всегда хорошо, особенно для фотографий.

Не очень обои на рабочем столе
Эйфелева башня на мониторе

Идея решения проблемы

Можно воспользоваться тем же методом, при помощи которого вертикальные видеоролики превращают в нормальные, горизонтальные. Для этого возьмём фрагмент исходного изображения, такой, чтобы его пропорции совпадали с пропорциями экрана.

Эйфелева башня с выделенной вырезаемой частью
Средняя часть фото, обрезанная под пропорции монитора

После этого растянем его (или сожмём) до размеров экрана и воспользуемся каким-нибудь размывающим фильтром (например, фильтром Гаусса). Затем, сохраняя пропорции исходной фотографии, уменьшим её так, чтобы она поместилась на экран (по вертикали или по горизонтали), и наложим эту уменьшенную фотографию на наш вырезанный и замыленный фрагмент.

Монитор с обоями, подготовленными из исходной фотографии
Получились вот такие обои

Результат остаётся только сохранить в файл (png или jpg).

Все описанные операции легко сделать при помощи библиотеки Pillow.

Использование скрипта

Назовём наш скрипт make_wall.py, и сделаем так, чтобы его можно было запускать следующим образом:

python make_wall.py 1920x1080 исходная_фотография.jpg wallpaper.jpg

Здесь 1920x1080 — размер экрана в формате WxH (W — ширина, H — высота экрана); исходная_фотография.jpg — имя файла с исходным изображением; wallpaper.jpg — имя файла, куда нужно сохранить результат. Если имя файла с результатом не указано, подразумевается имя wallpaper.jpg.

Вытащить эти параметры можно, воспользовавшись списком sys.argv (из модуля sys, как можно понять, не забудьте его импортировать).

Необходимо предусмотреть контроль параметров на ошибки. Возможные ошибки:

  1. Размер изображения в неправильном формате (должно быть WxH, W и H — положительные целые числа, больше нуля, а x — это символ x, который икс или экс).
  2. Задано слишком много параметров.
  3. Задано мало параметров (параметров нет, или не указан исходный файл).

Примеры правильной команды:

python make_wall.py 1920x1080 my_baby.jpg wallpaper_baby.jpg

python make_wall.py 320x200 C:\Users\Me\Pictures\car.jpg

Во втором случае результат сохраняется в файл wallpaper.jpg в текущей папке.

Если параметры заданы ошибочно, надо сообщить причину ошибки и вывести справочную информацию. Например, так:

user@comp$ python3 make_wall.py
Не указаны разрешение экрана и входной файл.
Использование:
    python3 make_wall.py WxH исходный-файл [файл-с-обоями]
Здесь:
    WxH           - разрешение экрана в виде двух чисел (ширины и высоты в 
                    пикселях), разделённых символом "x". Например, 1920x1080.
    исходный-файл - файл с исходным изображением. Поддерживаются форматы jpg и png.
    файл-с-обоями - файл, в который будет сохранён результат. Если этот параметр не
                    указан, подразумевается файл wallpaper.jpg в текущем каталоге.

Так же надо учитывать, что исходный файл может не существовать или не открыться, что файл с результатом тоже может быть защищён от перезаписи, что места на диске может не хватить. Короче, нужно обработать соответствующие исключения (хотя бы в общем виде, к примеру, при невозможности открыть выходной файл на запись можно сообщать, что невозможно записать результат, не вдаваясь в подробности).

Что понадобится

  1. Модуль sys и входящий в него список argv (https://docs.python.org/3/library/sys.html#sys.argv)
  2. Модуль Image из Pillow (https://pillow.readthedocs.io/en/5.1.x/reference/Image.html)
  3. Модуль ImageFilter из Pillow (https://pillow.readthedocs.io/en/5.1.x/reference/ImageFilter.html)

Использованные фотографии

Фотография Эйфелевой башни взята с этого сайта (фотограф brileighmo).

Изображение компьютерного монитора взято отсюда.