На этом шаге мы рассмотрим особенности выполнения загрузки и сохранения готового изображения.
Для открытия файла с готовым изображением служит функция open(). Функция возвращает объект, с помощью которого производится дальнейшая работа с изображением. Если открыть файл с изображением не удалось, возбуждается исключение IOError. Формат функции:
open(<Путь или файловый объект>[, mode='r'])
В первом параметре можно указать абсолютный или относительный путь к изображению. Необязательный второй параметр задает режим доступа к файлу - если он не указан, файл будет доступен лишь для чтения.
Откроем файл cars.gif, который расположен в текущем рабочем каталоге:
>>> img = Image.open("cars.gif")
Вместо указания пути к файлу можно передать файловый объект, открытый в бинарном режиме. Пример:
>>> f = open ("cars.gif", "rb") # Открываем файл в бинарном режиме >>> img = Image.open (f) # Передаем объект файла >>> img.size # Получаем размер изображения (366, 227) >>> img.format # Выводим формат изображения 'GIF' >>> f.close () # Закрьваем файл
Как видно из примера, формат изображения определяется автоматически. Следует также заметить, что после открытия файла с помощью функции open() само изображение не загружается сразу из файла в память - загрузка производится при первой операции с изображением.
Загрузить изображение явным образом, если такая нужда возникнет, позволяет метод load() объекта изображения. Он возвращает объект, с помощью которого можно получить доступ к отдельным пикселам изображения. Указав внутри квадратных скобок два значения: горизонтальную и вертикальную координаты пикселя, можно получить или задать его цвет.
>>> img = Image.open("cartitle.jpg") >>> obj = img.load() >>> obj[25, 45] # Получаем цвет пикселя (91, 126, 96) >>> obj[25, 45] = (255, 0, 0) # Задаем цвет пикселя (красный)
Для доступа к отдельному пикселю вместо метода load() можно использовать методы getpixel() и putpixel(). Метод getpixel (<Координаты>) позволяет получить цвет указанного пикселя, а метод putpixel (<Координаты>, <Цвет>) изменяет цвет пикселя. Координаты пикселя указываются в виде кортежа из двух элементов. Необходимо заметить, что эти методы работают медленнее метода load (). Пример использования методов getpixel() и putpixel() приведен ниже.
>>> img = Image.open("cartitle.jpg") >>> img.getpixel((25, 45)) # Получаем цвет пикселя (91, 126, 96) >>> img.putpixel((25, 45), (255, 0, 0)) # Изменяем цвет пикселя >>> img.getpixel((25, 45)) # Получаем цвет пикселя (255, 0, 0) >>> img.show() # Просматриваем изображение
В этом примере для просмотра изображения мы воспользовались методом show(). Метод show() создает временный файл в формате BMP и запускает программу для просмотра изображений, используемую в операционной системе по умолчанию.
Для сохранения изображения в файл предназначен метод save(). Формат метода:
save(<Путь или файловый объект>[, <Формат>[, <Опции>]])
В первом параметре указывается абсолютный или относительный путь. Вместо пути можно передать файловый объект, открытый в бинарном режиме. Сохраним изображение в форматах JPEG и BMP разными способами.
>>> img = Image.open("cars.gif") >>> img.save("tmp.jpg") # В формате JPEG >>> img.save("tmp.bmp", "BMP") # В формате BMP >>> f = open("tmp2.bmp", "wb") >>> img.save(f, "BMP") # Передаем файловый объект >>> f.close()
Обратите внимание на то, что мы открыли файл в формате GIF, а сохранили его в форматах JPEG и BMP. To есть, можно открывать изображения в одном формате и конвертировать их в другой формат. Если сохранить изображение не удалось, возбуждается исключение IOError. Когда параметр <Формат> не задан, формат изображения определяется по расширению файла, однако если методу save() в качестве первого параметра передан файловый поток, формат должен быть указан.
В параметре <Опции> можно передать дополнительные опции. Поддерживаемые опции зависят от формата изображения. Например, по умолчанию изображения в формате JPEG сохраняются с качеством 75. С помощью опции quality можно указать другое значение в диапазоне от 1 до 100. Пример:
>>> img.save ("tmp3.jpg", "JPEG", quality=100) # Указание качества
За дополнительной информацией по опциям обращайтесь к соответствующей документации.
На следующем шаге мы рассмотрим создание нового изображения.