¿Cómo mostrar imágenes PIL en la pantalla?

82

Estoy editando imágenes con la biblioteca PIL. El caso es que no quiero guardar la imagen cada vez en mi HDD para verla en Explorer. ¿Existe un módulo pequeño que simplemente me permite configurar una ventana y mostrar la imagen?

Bartlomiej Lewandowski
fuente
¿Mostrar la imagen cómo ? ¿En un navegador?
en una ventana hecha en pitón. Algo así como una ventana de pygame. Podría hacerlo en pygame, pero me gustaría una mejor solución.
Bartlomiej Lewandowski
1
¿Por qué no quieres guardarlo?
Joran Beasley
1
digamos que tengo 100 imágenes pequeñas para mirar. Sería mejor si pudiera tenerlos todos impresos en mi pantalla, sin tener que abrirlos en algún otro programa. No estoy realmente familiarizado con wxpython. Es simple
Bartlomiej Lewandowski
1
Necesitará alguna biblioteca de ventanas, ya sea pygame, wxPython, TkInter, PyQt, PyGtk, PyWin32, PyObjC, etc., para abrir una ventana. Una vez que tiene una ventana abierta, la mayoría de ellos hacen que sea trivial mostrar una imagen en esa ventana.
abarnert

Respuestas:

116

Del tutorial de PIL :

Una vez que tenga una instancia de la clase Image , puede usar los métodos definidos por esta clase para procesar y manipular la imagen. Por ejemplo, mostremos la imagen que acabamos de cargar:

     >>> im.show()

Actualizar:

Hoy en día, el Image.show()método está documentado formalmente en la bifurcación Pillow de PIL junto con una explicación de cómo se implementa en diferentes sistemas operativos.

martineau
fuente
en realidad es lo que estaba buscando, pero aparece un error en la galería de fotos de Windows Live. 0x800706ba
Bartlomiej Lewandowski
3
Esto se debe a que la galería de fotos en vivo de Windows está asociada con el tipo de archivo temporal que PIL creó cuando llamó al método, que probablemente sea el predeterminado .bmp en Windows, que no admite muchas de las capacidades de los formatos de archivo de imagen modernos. Intente establecer el atributo de formato de imagen explícitamente en .png (es decir im.format = "PNG") antes de la im.show()llamada.
martineau
aún el problema persiste. De hecho, podría probar con una biblioteca de ventanas.
Bartlomiej Lewandowski
3
El show()método incorporado de PIL es la versión más simple posible del "script de algún otro programa para mostrarlo". (En sistemas Windows anteriores, terminaría con un montón de ventanas MSPaint). Valía la pena sugerirlo e intentarlo, incluso si no funcionaba. De hecho, podría hacer algo similar, y casi tan simple, por ejemplo, ejecutando explícitamente MSPaint.exe en cada imagen…
abarnert
3
@abarnert: En realidad, el problema suena como un error en la Galería fotográfica de Windows Live 2011 y hay una versión más nueva que se puede descargar y que puede solucionar el show()problema de PIL .
martineau
22

Probé esto y funciona bien para mí:

from PIL import Image
im = Image.open('image.jpg')
im.show()
Harvey
fuente
1
Si bien esto puede responder a la pregunta (no probada), es una buena práctica proporcionar una explicación con su código en SO. En realidad, se desaconseja dar solo respuestas de código.
d_kennetz
2
Esto no parece funcionar en el cuaderno de Google Colab.
kawingkelvin
2
@kawingkelvin La pregunta fue "¿Cómo mostrar imágenes PIL en la pantalla?". Debería buscar una respuesta para su situación específica en otro lugar ... quizás aquí: stackoverflow.com/questions/55288657/…
Harvey
8

Si encuentra que PIL tiene problemas en algunas plataformas, el uso de un visor de imágenes nativo puede ayudar.

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

Para MacOS:

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

Para la mayoría de los sistemas GNU / Linux con X.Org y un entorno de escritorio:

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

Para ventanas:

import os
os.system("powershell -c tmp.png")
Pies de plumas
fuente
Pluma, en MacOS, no necesariamente se abrirá en Vista previa, pero de forma predeterminada para el tipo de archivo. Estaba trabajando con algunos archivos jpg de gran tamaño, que Preview convierte a .png, en unos 20 segundos. Cambiar el jpg predeterminado a Chrome funcionó de maravilla ...
John White
2

Puede mostrar una imagen en su propia ventana utilizando Tkinter, sin depender de los visores de imágenes instalados en su sistema:

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()

Para Python 3, reemplace import Tkinter as tkcon import tkinter as tk.

Apostolos
fuente
2
¿¿Dónde vio que el código implica guardar la imagen en el disco? La pregunta pide una forma de editar una imagen sin tener que guardarla en el disco cada vez. Pero debes abrir la imagen del disco al menos una vez al principio. Luego, puede procesar y ver la imagen cargada en la memoria como 'img' tantas veces como desee sin involucrar ninguna operación de disco.
Apostolos