Как сохранить изображение python
Перейти к содержимому

Как сохранить изображение python

  • автор:

Как сохранить изображение python

Шаг 222.
Основы языка Python.
Библиотека Pillow. Работа с изображениями. Загрузка готового изображения

На этом шаге мы рассмотрим особенности выполнения загрузки и сохранения готового изображения .

Для открытия файла с готовым изображением служит функция 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) # Указание качества 

За дополнительной информацией по опциям обращайтесь к соответствующей документации.

На следующем шаге мы рассмотрим создание нового изображения .

Четыре метода загрузки изображений с веб-сайта с помощью Python

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

1-ый метод

Первый метод использует модуль urllib (или же urllib2). Пусть имеется ссылка на некое изображение img. Метод выглядит следующим образом:

import urllib resource = urllib.urlopen(img) out = open(". \img.jpg", 'wb') out.write(resource.read()) out.close() 

Здесь нужно обратить внимание, что режим записи для изображений — ‘wb’ (бинарный), а не просто ‘w’.

2-ой метод

Второй метод использует тот же самый urllib. В дальнейшем будет показано, что этот метод чуть медленнее первого (отрицательный оттенок фактора скорости парсинга неоднозначен), но достоин внимания из-за своей краткости:

import urllib urllib.urlretrieve(img, ". \img.jpg") 

Притом стоит заметить, что функция urlretrieve в библиотеке urllib2 по неизвестным мне причинам (может кто подскажет по каким) отсутствует.

3-ий метод

Третий метод использует модуль requests. Метод имеет одинаковый порядок скорости выгрузки картинок с первыми двумя методами:

import requests p = requests.get(img) out = open(". \img.jpg", "wb") out.write(p.content) out.close() 

При этом при работе с веб в питоне рекомендуется использовать именно requests вместо семейств urllib и httplib из-за его краткости и удобства обращения с ним.

4-ый метод

Четвертый метод по скорости кардинально отличается от предыдущих методов (на целый порядок). Основан на использовании модуля httplib2. Выглядит следующим образом:

import httplib2 h = httplib2.Http('.cache') response, content = h.request(img) out = open('. \img.jpg', 'wb') out.write(content) out.close() 

Здесь явно используется кэширование. Без кэширования (h = httplib2.Http()) метод работает в 6-9 раза медленнее предыдущих аналогов.

Тестирование скорости проводилось на примере скачивания картинок с расширением *.jpg c сайта новостной ленты lenta.ru. Выбор картинок, подпадающих под этот критерий и измерение времени выполнения программы производились следующим образом:

import re, time, urllib2 url = "http://lenta.ru/" content = urllib2.urlopen(url).read() imgUrls = re.findall('img .*?src="https://habr.com/ru/articles/210238/(.*?)"', сontent) start = time.time() for img in imgUrls: if img.endswith(".jpg"): """реализация метода по загрузке изображения из url""" print time.time()-start 

Постоянно меняющиеся картинки на сайте не повлияли на чистоту измерений, поскольку методы отрабатывали друг за другом. Полученные результаты таковы:

Таблица сравнения скоростей методов

Метод 1, с Метод 2, с Метод 3, с Метод 4, с (без кэширования, с)
0.823 0.908 0.874 0.089 (7.625)

Данные представлены как результат усреднения результатов семи измерений.
Просьба к тем, кто имел дело с библиотекой Grab (и с другими), написать в комментариях аналогичный метод по скачиванию изображений с помощью этой и других библиотек.

  • питон и парсинг
  • изображения

Сохранить график как изображение с помощью Matplotlib

Matplotlib — одна из наиболее широко используемых библиотек визуализации данных в Python. Обычно графики и визуализации Matplotlib делятся с другими.

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

Создание сюжета

Сначала создадим простой сюжет:

import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.sin(x) plt.plot(x, y) plt.show() 

Здесь мы построили синусоидальную функцию, начиная с 0 и заканчивая 10 с шагом 0.1 . Выполнение этого кода дает:

Теперь давайте посмотрим, как мы можем сохранить эту фигуру как изображение.

Сохранить график как изображение в Matplotlib

В предыдущем примере мы сгенерировали график с помощью функции plot() , передав данные, которые мы хотели бы визуализировать.

Этот график создается, но не отображается нам, если мы не вызываем функцию show() . Функция show() , как следует из названия, показывает сгенерированный участок пользователю в окне.

После создания мы также можем сохранить этот рисунок / график как файл — используя функцию savefig() :

import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.sin(x) plt.plot(x, y) plt.savefig('saved_figure.png') 

Теперь, когда мы запускаем код, вместо всплывающего окна с графиком у нас есть файл ( saved_figure.png ) в каталоге нашего проекта.

Этот файл содержит точно такое же изображение, которое мы бы показывали в окне:

Стоит отметить, что функция savefig() не уникальна для экземпляра plt . Вы также можете использовать его на объекте Figure :

import matplotlib.pyplot as plt import numpy as np fig = plt.figure() x = np.arange(0, 10, 0.1) y = np.sin(x) plt.plot(x, y) fig.savefig('saved_figure.png') 

У функции savefig() есть обязательный аргумент filename . Здесь мы указали имя файла и формат.

Кроме того, она принимает другие варианты, такие как dpi , transparent , bbox_inches , quality и т.д.

В следующих разделах мы рассмотрим некоторые популярные варианты.

Настройка разрешения изображения

Параметр DPI определяет количество точек (пикселей) на дюйм. По сути, это разрешение создаваемого изображения. Давайте протестируем несколько разных вариантов:

import matplotlib.pyplot as plt import numpy as np fig = plt.figure() x = np.arange(0, 10, 0.1) y = np.sin(x) plt.plot(x, y) fig.savefig('saved_figure-50pi.png', dpi = 50) fig.savefig('saved_figure-100dpi.png', dpi = 100) fig.savefig('saved_figure-1000dpi.png', dpi = 1000) 

Это приводит к появлению трех новых файлов изображений на нашем локальном компьютере, каждый с разным DPI:

Значение по умолчанию — 100 .

Сохраните прозрачное изображение с помощью Matplotlib

Аргумент transparent может быть использован для создания участка с прозрачным фоном. Это полезно, если вы будете использовать графическое изображение в презентации, на бумаге или хотите представить его в настройках индивидуального дизайна:

import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.sin(x) plt.plot(x, y) plt.savefig('saved_figure.png', transparent=True) 

Если мы поместим это изображение на темный фон, это приведет к:

Изменение цвета графика

Вы можете изменить цвет подложки, используя аргумент facecolor . Он принимает color и по умолчанию white .

Изменим его на red :

import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.sin(x) plt.plot(x, y) plt.savefig('saved_figure-colored.png', facecolor = 'red') 

Настройка границы изображения

Аргумент bbox_inches принимает строку и определяет границу вокруг граффика. Если мы хотим установить его так tight , то есть максимально обрезать рамку, мы можем установить аргументу bbox_inches значение ‘tight’ :

import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.sin(x) plt.plot(x, y) plt.savefig('saved_figure-tight.png', bbox_inches = 'tight', facecolor='red') 

В результате получается плотно упакованная коробка. Это легче визуализировать, если для справки раскрасить края другим цветом:

Вывод

В этом уроке мы рассмотрели несколько способов сохранить график в виде файла изображения с помощью Matplotlib.

Как сохранять фото на питон?

Нужен код для скачивания картинки с сайта (желательно,python)
есть определённая картинка,нужно её скачать.Подскажите пожалуйста код,например,для скачивания этой картинки https://pp.vk.me/c540104/c624218/v624218602/3321/u.

  • Вопрос задан более трёх лет назад
  • 29601 просмотр

Комментировать

Решения вопроса 8

На python 3 так можно:

import urllib.request url = "https://pp.vk.me/c540104/c624218/v624218602/3321/uYVa4FQv_q0.jpg" img = urllib.request.urlopen(url).read() out = open("img.jpg", "wb") out.write(img) out.close

Ответ написан более трёх лет назад

Нравится 12 1 комментарий

kostya__wolf

Константин Волков @kostya__wolf Автор вопроса

Большое спасибо за помощь!

борец с ветряными мельницами

И всего один человек использовал with, чудеса какие-то. Вот еще более общая реализация для python + requests:

import requests URL = 'https://pp.vk.me/c540104/c624218/v624218602/3321/uYVa4FQv_q0.jpg' r = requests.get(URL) with open(filename, 'wb') as fd: for chunk in r.iter_content(): fd.write(chunk)

Ответ написан более трёх лет назад

Нравится 12 2 комментария

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *