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

Как открыть изображение в python

  • автор:

Как открыть изображение в python

Автор: br0ke

Текстовые метки: python, pil, pillow, image, open, stream, file-like, file

Раздел: Информационные технологии — Python — Библиотеки — PIL

Запись: and-semakin/mytetra_data/master/base/1527085588iln7pxjyp0/text.html на raw.githubusercontent.com

from PIL import Image

  • Открыть изображение в PIL
  • Размер изображения в PIL
  • Сохранить изображение в память в PIL
  • Изменить размер изображения в PIL
  • MD5 хэш изображения PIL в Python

Функция Image.open() модуля Pillow в Python

Способы открыть изображение для редактирования в Python

Содержание:

  • Синтаксис и описание функции Image.open() ;
  • Жизненный цикл изображения;
  • Примеры использования функции Image.open() .

Синтаксис и описание функции Image.open() :

from PIL import Image img = Image.open(fp, mode='r', formats=None) 

Параметры:

  • fp — имя файла (строка), pathlib.Path объект или объект file . Объект file должен иметь методы file.read , file.seek и file.tell методы и открыт в двоичном режиме.
  • mode=’r’ — режим. Если задан, то должен быть r .
  • formats=None — список или кортеж форматов, в которых нужно попытаться загрузить файл. Аргумент можно использовать для ограничения набора проверяемых форматов. Значение None означает все поддерживаемые форматы. Можно распечатать набор доступных форматов, запустив python3 -m PIL или используя функцию PIL.features.pilinfo() .

Возвращаемое значение:

  • Объект изображения Image .

Описание:

Функция Image.open() модуля Pillow открывает и идентифицирует данный файл изображения.

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

Пользователи библиотеки должны использовать диспетчер контекста или вызывать img.close() для любого изображения, открытого с помощью имени файла или объекта pathlib.Path для закрытия базового файла.

Способы открытия файла:

from PIL import Image import io import pathlib with Image.open("test.jpg") as img: . with Image.open(pathlib.Path("test.jpg")) as img2: . with open("test.jpg", "rb") as f: img3 = Image.open(f) . with open("test.jpg", "rb") as f: img4 = Image.open(io.BytesIO(f.read())) . 

Если имя файла или объект pathlib.Path передается Pillow, то результирующий файловый объект, открытый Pillow, также может быть закрыт Pillow после вызова метода img.load() , при условии, что связанное изображение не имеет нескольких кадров.

Pillow обычно не может закрыть и снова открыть файл, поэтому любой доступ к этому файлу должен быть до его закрытия.

Возможные исключения при открытии файла изображения:

  • FileNotFoundError : если файл не найден.
  • PIL.UnidentifiedImageError : если изображение не может быть идентифицировано и открыто.
  • ValueError : если аргумент моде не r или если для файлового потока fp используется экземпляр StringIO .
  • TypeError : если аргумент formats не содержит открываемого формата изображения.

Жизненный цикл изображения.

  1. Имена файлов и объекты pathlib.Path открываются Image.open() как файл. Из открытого файла считываются метаданные. Файл остается открытым для дальнейшего использования.
  2. Когда требуются пиксельные данные изображения, вызывается метод img.load() . Текущий кадр считывается в память. Изображение теперь можно использовать независимо от базового файла изображения.
  3. Любой метод Pillow, который создает новый экземпляр изображения на основе другого, будет внутренне вызывать img.load() для исходного изображения, а затем считывать данные. Новый экземпляр изображения не будет связан с исходным файлом изображения.
  4. Если имя файла или объект pathlib.Path были переданы Image.open() , то файловый объект был открыт Pillow и считается, что он используется исключительно Pillow. Таким образом, если изображение представляет собой однокадровое изображение, файл будет закрыт в этом методе после того, как кадр будет прочитан. Если изображение представляет собой многокадровое изображение (например, многостраничный TIFF и анимированный GIF ), файл изображения остается открытым, чтобы img.seek() мог загрузить соответствующий кадр.
  5. Метод img.close() закрывает файл и уничтожает основной объект изображения. Менеджер контекста Pillow также закроет файл, но не уничтожит основной объект изображения.
with Image.open("test.jpg") as img: img.load() assert img.fp is None img.save("test.png") 

Жизненный цикл однокадрового изображения относительно прост. Файл должен оставаться открытым до тех пор, пока не будет вызвана функция img.load() или img.close() или не завершится контекстный менеджер.

Многокадровые изображения более сложны. Метод img.load() не является терминальным методом, поэтому он не должен закрывать базовый файл. Как правило, Pillow не знает, будут ли какие-либо запросы на дополнительные данные, пока вызывающая сторона явно не закроет изображение.

Примеры использования функции Image.open() .

  • Идентификация файлов изображений;
  • Открыть изображение по URL;
  • Чтение изображений из архива tar ;
  • Чтение изображения в режиме черновика;
  • Создание миниатюр.

Открыть, повернуть и отобразить изображение (используя средство просмотра по умолчанию):

from PIL import Image with Image.open("test.jpg") as img: img.rotate(45).show() 

Идентификация файлов изображений.

import sys from PIL import Image for infile in sys.argv[1:]: try: with Image.open(infile) as img: print(infile, img.format, f"img.size>ximg.mode>") except OSError: pass 

Открыть изображение по URL.

from PIL import Image from urllib.request import urlopen url = "https://python-pillow.org/images/pillow-logo.png" with Image.open(urlopen(url)) as img: img.save('pillow-logo.png') 

Чтение изображений из архива tar .

from PIL import Image, TarIO with TarIO.TarIO("test.tar", "hopper.jpg") as fp: img = Image.open(fp) 

Чтение изображения в режиме черновика.

Доступно только для файлов JPEG и MPO.

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

Метод img.draft() манипулирует открытым, но еще не загруженным изображением, чтобы оно максимально соответствовало заданному режиму и размеру. Это делается путем перенастройки декодера изображений.

from PIL import Image with Image.open(file) as img: print("original =", img.mode, img.size) img.draft("L", (100, 100)) print("draft =", img.mode, img.size) 

Создание миниатюр.

Следующий код создает красивые эскизы всех изображений JPEG в текущем каталоге, сохраняя соотношение сторон с максимальным разрешением 128×128.

from PIL import Image import glob, os size = 128, 128 for infile in glob.glob("*.jpg"): file, ext = os.path.splitext(infile) with Image.open(infile) as img: img.thumbnail(size) img.save(f"file>.thumbnail", "JPEG") 
  • КРАТКИЙ ОБЗОР МАТЕРИАЛА.
  • Функция Image.open() модуля Pillow
  • Функция Image.new() модуля Pillow
  • Функция Image.frombytes() модуля Pillow
  • Функция Image.frombuffer() модуля Pillow
  • Функция Image.fromarray() модуля Pillow
  • Создание скриншота с использованием Pillow
  • Объект Image модуля Pillow
  • Обработка GIF изображений в Pillow
  • Параметры для JPG, ICO и WebP модуля Pillow
  • Извлечение EXIF-тегов модулем Pillow
  • Встроенные фильтры улучшения модуля Pillow
  • Фильтры передискретизации модуля Pillow
  • Подмодуль ImageDraw модуля Pillow
  • Функция Image.alpha_composite() модуля Pillow
  • Функция Image.blend() модуля Pillow
  • Функция Image.composite() модуля Pillow
  • Функция Image.merge() модуля Pillow
  • Функция Image.eval() модуля Pillow
  • Регулировка яркости, контрастности, резкости и насыщенности: Pillow
  • Автоматическая регулировка контрастности, Pillow
  • Тонирование черно-белого фото модулем Pillow
  • Масштабирование изображений с модулем Pillow
  • Добавить/обрезать рамку изображения, модуль Pillow
  • Перевернуть/отразить изображение, модуль Pillow
  • Обесцвечивание/инверсия изображения, модуль Pillow
  • Операции с каналами изображений, модуль Pillow

Как работать с файлами в Python

Как работать с файлами в Python

Программа на Python — это не только функционал, но и оптимальная система работы с файлами. Например, если вы пишете чат-бот, вам нужно загрузить в него готовые ответы в файле txt. Если вы сделали программу для обработки фото — здесь ваш код на Python должен быть готов обрабатывать файлы, которые загрузит в сервис пользователь. В этой статье разберемся, как работать с файлами на Python, какие для этого есть библиотеки и методы.

Освойте профессию
«Python-разработчик»

Что такое файл

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

Python-разработчик
Освойте Python, самый популярный язык программирования
3 383 ₽/мес 6 150 ₽/мес

dffsdd (3)

  • открытие;
  • операции чтения из файла и записи в файл;
  • закрытие.

Разберемся со всеми действиями по порядку.

Открытие файла на чтение и запись в Python

На компьютере файл надо открыть перед тем, как вносить в него изменения. Такое же правила действует и для Python: нужно открыть файл на чтение и запись. Без этапа открытия нельзя читать содержимое или изменять его. Открыть файл можно с помощью функции open() :

open(file, mode='rt')

В функцию в качестве аргументов требуется передать путь файлу (file) и выбрать режим работы (mode). По умолчанию Python выбирает значение rt , но доступны и другие режимы:

Аргумент mode
Как работает
Чтение из файла
Открыть как текстовый файл
Запись в файл и создание файла, если его не существует
Запись в файл и вызовы исключения, если файла не существует
Открыть как двоичный файл
Запись в файл путем добавления новых значений в конец
Работа в режиме чтения и записи

Можно комбинировать режимы и использовать сразу несколько. К примеру, по умолчанию функция open() принимает аргумент rt . Это значит, что файл будет открыт в виде текстового документа для чтения. С помощью r+ и w+ можно открыть файл сразу для чтения и записи на Python. В первом случае несуществующие файлы будут создаваться, а во втором такое действие спровоцирует вызов исключения.

Если в Python надо открыть файл data.txt в виде текстового документа с правами для чтения, то для этого следует использовать следующий код:

f = open('data.txt')

При этом Python установит режим открытия файла по умолчанию. Если нужен другой режим, то следует передать в функцию аргументы mode:

f = open('data.txt', 'w+')

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

f = open('data.txt', 'w+') # действия с файлом f.close()

Также файлы можно открывать с помощью менеджера контекста with . В этом случае файл автоматически закроется, когда работа с ним завершится:

with open('data.txt', 'w+') as f: # действия с файлом

При открытии файла можно дополнительно указать кодировку, если нужна специфическая или требуется больше контроля над работой кода:

with open('data.txt', 'w+', encoding='utf-8') as f: # действия с файлом

Кодировку можно указать третьим параметром и при обычном способе открытия:

f = open('data.txt', 'w+', encoding='utf-8') # действия с файлом f.close()

Чтение файла

Чтение из файла Python можно реализовать с помощью функции read(), если он открыт в режиме чтения r . Синтаксис функции выглядит следующим образом:

file.read(size)

В строке выше file обозначает объект, с которым работаем, а size — количество символов для чтения. Если ничего не указать в качестве аргумента функции read() , то получится прочитать сразу все содержимое документа.

Для примера: создадим в проекте file.txt и запишем в него строку «Привет, Python!». Теперь прочитаем первые шесть символов из файла:

with open('file.txt', 'r', encoding='utf-8') as f: data = f.read(6) print(data)

Если запустить код, то Python выведет в консоль фразу «Привет» — это и есть первые шесть символов строки «Привет, Python!» в file.txt:

>>> Привет

Теперь отредактируем код. В этом примере не будем передавать никакие аргументы в функцию read() :

with open('file.txt', 'r', encoding='utf-8') as f: data = f.read() print(data) >>> Привет, Python!

В этом случае система выводит сразу все содержимое файла.

Содержимое файла можно считывать построчно. Убедимся в этом, отредактировав file.txt. Добавим в него список продуктов:

Морковь Сметана Мука Яблоки

Теперь прочитаем этот список с помощью функции readline() :

with open('file.txt', 'r', encoding='utf-8') as f: print(f.readline()) >>> Морковь

Python прочитал первую строку списка продуктов. Если вызвать функцию readline() несколько раз, то получится прочитать последующие строки файла:

with open('file.txt', 'r', encoding='utf-8') as f: print(f.readline()) print(f.readline()) print(f.readline()) print(f.readline()) >>> Морковь >>> Сметана >>> Мука >>> Яблоки

Более удобно последовательное чтение с помощью readline() можно реализовать в цикле:

with open('file.txt', 'r', encoding='utf-8') as f: for line in f: print(line) >>> Морковь >>> Сметана >>> Мука >>> Яблоки

Все строки файла можно прочитать с помощью метода readlines() , возвращающего содержимое в виде списка вместе со специальными символами:

with open('file.txt', 'r', encoding='utf-8') as f: data = f.readlines() print(data) >>> ['Морковь\n', 'Сметана\n', 'Мука\n', 'Яблоки']

Такое чтение можно реализовать и без метода readlines() , воспользовавшись конструктором списков list() :

with open('file.txt', 'r', encoding='utf-8') as f: data = list(f) print(data) >>> ['Морковь\n', 'Сметана\n', 'Мука\n', 'Яблоки']

При чтении всего файла в Python стоит помнить, что он может быть слишком большим. Если разместить его полностью в оперативной памяти компьютера не получается, следует считывать его частями.

Запись в файл на Python

Для записи файла в Python используется функция write() . В качестве аргумента ей следует передать строку, содержимое которой будет записано:

file.write(string)

Удалим все содержимое file.txt и запишем в него строку «Привет, Python!»:

with open('file.txt', 'a', encoding='utf-8') as f: data = 'Привет, Python!' f.write(data)

Обратите внимание, что в этом примере мы открыли файл в режиме a, что позволяет записывать новые строки в конец. Выполняем код, открываем файл — теперь в нем содержится строка «Привет, Python!».

В файл можно записать сразу список строк. Для этого применяется метод writelines() , которому в качестве аргумента надо передать сам список. В качестве примера создадим переменную со списком продуктов и запишем ее в file.txt:

with open('file.txt', 'a', encoding='utf-8') as f: grocery = ['Морковь', 'Яблоки', 'Мука', 'Молоко'] f.writelines(grocery)

Если выполнить код и проверить file.txt, то мы увидим единую строку без пробелов. Все дело в том, что метод writelines() не добавляет разделители строк автоматически. Нужно сделать это вручную, прописав \n каждому элементу списка:

with open('file.txt', 'a', encoding='utf-8') as f: grocery = ['Морковь\n', 'Яблоки\n', 'Мука\n', 'Молоко\n'] f.writelines(grocery)

Теперь при выполнении кода каждый элемент списка будет записываться на новую строку.

Станьте разработчиком на Python и решайте самые разные задачи: от написания кода до автоматизации процессов

Управление указателем

В Python есть возможность явно задать позицию указателя в файле — для этого используется метод seek(). Узнать текущую позицию можно с помощью метода tell() .

Рассмотрим принципы работы с методами на примере. Откроем file.txt в режиме доступа r+ и запишем в него строку «0123456789ABCDEF»:

with open('file.txt', 'r+', encoding='utf-8') as f: f.write('0123456789ABCDEF')

Теперь прочитаем седьмой символ в строке. Для этого воспользуемся методом seek() для перемещения указателя. В качестве аргумента надо передать функции аргумент смещения в байтах. Вспомним, что нумерация строк начинается с нуля, а нам надо прочитать седьмой символ строки. Значит, укажем смещение в шесть байтов:

with open('file.txt', 'r+', encoding='utf-8') as f: f.write('123456789ABCDEF') f.seek(5) data = f.read(1) print(data) >>> 6

Можно осуществить смещение с конца, тогда в качестве второго элемента надо передать отправную точку для формирования смещения. Всего доступны три начальные позиции:

  • 0 — от начала файла;
  • 1 — от текущей позиции;
  • 2 — от конца файла.

Теперь прочитаем четвертый символ с конца строки:

with open('file.txt', 'r+b') as f: f.seek(-4, 2) data = f.read(1) print(data) >>> b'C'

Узнать байт позиции указателя можно с помощью метода tell() :

with open('file.txt', 'r+', encoding='utf-8') as f: f.write('123456789ABCDEF') f.read(5) print(f.tell())

Работа с файловой системой

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

Для работы с файловой системой на Python используют встроенная библиотека OS. Ее необходимо отдельно импортировать в код проекта, чтобы получить доступа к ее методам:

import os

Теперь узнаем с помощью Python текущий каталог. Делаем это с помощью метода getcwd() . В выводе метода получим путь к папке, в которой сейчас находимся:

import os print(os.getcwd()) >>> /Users/daniilshat/PycharmProjects/pythonProject

С помощью метода listdir() можно получить список с содержимым каталога. В качестве аргумента можно передать путь к директории; если этого не сделать, то система покажет содержимое текущего каталога:

import os # содержимое текущего каталога print(os.listdir()) # содержимое директории PycharmProjects print(os.listdir('/Users/daniilshat/PycharmProjects')) >>> ['file.txt', 'main.py', '.idea'] >>> ['.DS_Store', 'pythonProject', 'bot', 'love-couples']

Для создания новых директорий файлов в Python используют метод mkdir() . В качестве аргумента ему надо передать полный путь, включая название новой директории. Для примера создадим директорию Example в PycharmProjects:

import os # содержимое директории PycharmProjects до создания print(os.listdir('/Users/daniilshat/PycharmProjects')) os.mkdir('/Users/daniilshat/PycharmProjects/Example') # содержимое директории PycharmProjects после создания print(os.listdir('/Users/daniilshat/PycharmProjects')) >>> ['.DS_Store', 'pythonProject', 'bot', 'love-couples'] >>> ['.DS_Store', 'pythonProject', 'Example', 'bot', 'love-couples']

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

import os dir = '/Users/daniilshat/PycharmProjects' old_file = os.path.join(dir, 'Example') new_file = os.path.join(dir, 'New Example') # содержимое директории PycharmProjects до переименования print(os.listdir(dir)) os.rename(old_file, new_file) # содержимое директории PycharmProjects после переименования создания print(os.listdir(dir)) >>> ['.DS_Store', 'pythonProject', 'Example', 'bot', 'love-couples'] >>> ['.DS_Store', 'pythonProject', 'bot', 'New Example', 'love-couples']

Для удаления пустых директорий файлов в Python можно использовать метод rmdir() , а для удаления директории со всем содержимым — shutil.rmtree() . В качестве аргумента требуется передать путь к директории. Для примера удалим директорию New Example, которую недавно создали:

import os # содержимое директории PycharmProjects до удаления print(os.listdir('/Users/daniilshat/PycharmProjects')) os.rmdir('/Users/daniilshat/PycharmProjects/New Example') # содержимое директории PycharmProjects после удаления print(os.listdir('/Users/daniilshat/PycharmProjects')) >>> ['.DS_Store', 'pythonProject', 'bot', 'New Example', 'love-couples'] >>> ['.DS_Store', 'pythonProject', 'bot', 'love-couples']

Итог

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

Метод Что делает
os.getcwd() Узнать текущий каталог
os.listdir(path) Узнать список содержимого каталога
os.mkdir(path) Создать директорию
os.rename(old_file, new_file) Переименовать файл или директорию
os.rmdir(path) Удалить пустую директорию
shutil.rmtree(path) Удалить директорию со всем содержимым
file.read(size) Прочитать определенное количество символов из файла
file.readline() Прочитать строку из файла
file.readlines() Прочитать все строки из файла
file.write(string) Записать строку в файл
file.writelines(list) Записать список строк в файл
file.seek(int) Переместить указатель
file.tell() Узнать текущее положение указателя

Python-разработчик

Освойте Python с нуля. Подготовим к трудоустройству: дадим много практики, реальные проекты для портфолио, поможем с резюме. Лучшие студенты пройдут стажировки в проектах компаний-партнеров.

Как открыть картинку через Python?

Чтобы открыть картинку, используя приложение по умолчанию, на Windows:

#!/usr/bin/env python import os os.startfile(r'D:\picture.jpg') 

Отслеживать
ответ дан 31 мар 2015 в 21:45
52.3k 11 11 золотых знаков 108 108 серебряных знаков 312 312 бронзовых знаков

Открыть наверное значит загрузить для показа (или обработки)? Если да то попробуйте через PIL, примерно так:

from PIL import Image #. img = Image.open(r'D:\picture.jpg') img.show() 

Отслеживать
48.7k 17 17 золотых знаков 56 56 серебряных знаков 100 100 бронзовых знаков
ответ дан 8 мар 2015 в 12:39
928 1 1 золотой знак 6 6 серебряных знаков 17 17 бронзовых знаков

Похоже, что человек хочет открыть ее в приложении по умолчанию, и при запуске из PyCharm что-то не так с окружением.

9 мар 2015 в 2:37
если использовать PIL, то картинка должна быть в папке с проектом?
9 мар 2015 в 14:09
Она может быть где угодно.
9 мар 2015 в 14:16

если обратный слэш есть в пути, то лучше r» константу использовать (в данном случае это не важно, так как ‘\p’ == r’\p’ , но в общем случае ‘\t’ != r’\t’ ).

31 мар 2015 в 21:43

Попробуйте так (картинка откроется в веб-браузере):

import webbrowser webbrowser.open(r"D:\picture.jpg") 

Отслеживать
48.7k 17 17 золотых знаков 56 56 серебряных знаков 100 100 бронзовых знаков
ответ дан 17 мар 2015 в 4:36
Алексей Лобанов Алексей Лобанов
1,202 9 9 серебряных знаков 22 22 бронзовых знака

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

введите сюда описание изображения

Opencv

import cv2 img = cv2.imread('x.jpg', 0) cv2.imshow('', img) cv2.waitKey(0) 

matplotlib:

from matplotlib import pyplot as plt img = plt.imread('x.jpg') plt.imshow(img) plt.show() 

matplotlib:

введите сюда описание изображения

введите сюда описание изображения

opencv:

Установка opencv:

sudo apt-get install -y cmake make libsm6 libxext6 libxrender-dev git clone https://github.com/opencv/opencv.git mkdir ./opencv/build cd ./opencv/build cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local .. make -j4 make install 

Флаг j указывает число процессов, которые будут использованы при установке

Установка matplotlib:

pip install matplotlib pip install pillow 

Если библиотека pillow не будет установлена, то можно будет пользоваться только * .png

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

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