Как вывести изображения PIL на экран?

82

Я занимаюсь редактированием изображений с помощью библиотеки PIL. Дело в том, что я не хочу каждый раз сохранять изображение на жесткий диск, чтобы просматривать его в проводнике. Есть ли небольшой модуль, который позволяет мне просто настроить окно и отображать изображение?

Бартломей Левандовски
источник
Выведите изображение как ? В браузере?
в окне, созданном на Python. Что-то вроде окна от pygame. Я мог бы сделать это в pygame, но хотелось бы лучшего решения.
Бартломей Левандовски
1
почему ты не хочешь его сохранить?
Джоран Бизли,
1
скажем, у меня есть 100 маленьких картинок, которые нужно просмотреть. Было бы лучше, если бы я мог распечатать их все на моем экране, без необходимости открывать их в какой-либо другой программе. Я не очень хорошо знаком с wxpython. Это просто?
Бартломей Левандовски
1
Чтобы открыть окно, вам понадобится некоторая библиотека окон - будь то pygame, wxPython, TkInter, PyQt, PyGtk, PyWin32, PyObjC и т. Д. После того, как вы открыли окно, большинство из них упрощают отображение изображения в этом окне.
abarnert

Ответы:

116

Из учебника PIL :

Если у вас есть экземпляр класса Image , вы можете использовать методы, определенные этим классом, для обработки и управления изображением. Например, давайте отобразим только что загруженное изображение:

     >>> im.show()

Обновить:

В настоящее время Image.show()метод официально задокументирован в вилке Pillow PIL вместе с объяснением того, как он реализован в разных ОС.

Мартино
источник
это на самом деле то, что я искал, но я получаю ошибку галереи фотографий Windows Live. 0x800706ba
Бартломей Левандовски
3
Это связано с тем, что фотогалерея Windows Live связана с типом временного файла PIL, созданного при вызове метода, который, вероятно, по умолчанию имеет формат .bmp в Windows, который не поддерживает многие возможности современных форматов файлов изображений. Попробуйте явно установить для атрибута формата изображения значение .png (т.е. im.format = "PNG") перед im.show()вызовом.
Мартино
по-прежнему проблема не устранена. Я могу попробовать оконную библиотеку.
Бартломей Левандовски
3
Встроенный show()метод PIL - это простейшая возможная версия «сценария какой-нибудь другой программы, чтобы показать это». (В более ранних системах Windows у вас была бы целая куча окон MSPaint.) Это стоило предложить и попробовать, даже если это не сработало. На самом деле вы могли бы сделать что-то подобное и почти такое же простое, например, явно запустив MSPaint.exe для каждого изображения…
abarnert
3
@abarnert: На самом деле проблема звучит как ошибка в Windows Live Photo Gallery 2011, и есть более новая версия, которую можно загрузить, которая может решить show()проблему PIL .
Мартино
22

Я протестировал это, и у меня он отлично работает:

from PIL import Image
im = Image.open('image.jpg')
im.show()
Харви
источник
1
Хотя это может ответить на вопрос (непроверенный), лучше всего предоставить объяснение с вашим кодом на SO. На самом деле не рекомендуется давать ответы только по коду.
d_kennetz
2
Похоже, это не работает с записной книжкой Google Colab.
kawingkelvin
2
@kawingkelvin Вопрос был «Как показать изображения PIL на экране?». Вам следует искать ответ для вашей конкретной ситуации в другом месте ... возможно, здесь: stackoverflow.com/questions/55288657/…
Харви,
8

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

img.save("tmp.png") #Save the image to a PNG file called tmp.png.

Для MacOS:

import os
os.system("open tmp.png") #Will open in Preview.

Для большинства систем GNU / Linux с X.Org и средой рабочего стола:

import os
os.system("xdg-open tmp.png")

Для Windows:

import os
os.system("powershell -c tmp.png")
Перо ноги
источник
Feather в MacOS не обязательно открывается в предварительном просмотре, но по умолчанию для данного типа файла. Я работал с некоторыми большими файлами jpg, которые Preview конвертировал в .png, что занимало около 20 секунд. Изменение jpg по умолчанию на Chrome творит чудеса ...
Джон Уайт
6

Возможно, вы можете использовать для этого matplotlib, вы также можете рисовать с ним обычные изображения. Если вы вызываете show (), изображение появляется в окне. Взгляните на это:

http://matplotlib.org/users/image_tutorial.html

Puckl
источник
2

Вы можете отображать изображение в собственном окне с помощью Tkinter, в зависимости от установленных в вашей системе средств просмотра изображений:

import Tkinter as tk
from PIL import Image, ImageTk  # Place this at the end (to avoid any conflicts/errors)

window = tk.Tk()
#window.geometry("500x500") # (optional)    
imagefile = {path_to_your_image_file}
img = ImageTk.PhotoImage(Image.open(imagefile))
lbl = tk.Label(window, image = img).pack()
window.mainloop()

Для Python 3 замените import Tkinter as tkна import tkinter as tk.

Апостолос
источник
2
Где вы видели, что код предполагает сохранение образа на диск ??? В вопросе предлагается способ редактирования изображения без необходимости каждый раз сохранять его на диск. Но вы должны сначала открыть образ с диска хотя бы один раз. Затем вы можете обрабатывать и просматривать изображение, загруженное в память как img, сколько угодно раз, без каких-либо операций с диском.
Апостолос