Как сохранить изображение 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 Автор вопроса
Большое спасибо за помощь!
борец с ветряными мельницами
И всего один человек использовал 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 комментария