web-dev-qa-db-fra.com

Obtenir le nom du fichier image à partir de l'image PIL

Est-il possible d'obtenir le nom de fichier d'une image que j'ai déjà ouverte à partir d'un objet Image? J'ai vérifié l'API, et le mieux que j'ai pu trouver était le PIL.Image.info, mais qui semble vide lorsque je le vérifie. Puis-je utiliser autre chose pour obtenir ces informations dans la bibliothèque d'images PIL?

(Oui, je me rends compte que je peux passer le nom de fichier dans la fonction. Je cherche une autre façon de le faire.)

c'est à dire.

from PIL import Image

def foo_img(img_input):
  filename = img_input.info["filename"]
  # I want this to print '/path/to/some/img.img'
  print(filename) 

foo_img(Image.open('/path/to/some/img.img'))
6
Derek Halden

Je ne sais pas si cela est documenté quelque part, mais simplement en utilisant dir sur une image que j'ai ouverte a montré un attribut appelé filename:

>>> im = Image.open(r'c:\temp\temp.jpg')
>>> im.filename
'c:\\temp\\temp.jpg'

Malheureusement, vous ne pouvez pas garantir que cet attribut sera sur l'objet:

>>> im2 = Image.new('RGB', (100,100))
>>> im2.filename
Traceback (most recent call last):
  File "<pyshell#50>", line 1, in <module>
    im2.filename
AttributeError: 'Image' object has no attribute 'filename'

Vous pouvez contourner ce problème en utilisant un try/except pour attraper le AttributeError, ou vous pouvez tester pour voir si l'objet a un nom de fichier avant d'essayer de l'utiliser:

>>> hasattr(im, 'filename')
True
>>> hasattr(im2, 'filename')
False
>>> if hasattr(im, 'filename'):
    print(im.filename)

c:\temp\temp.jpg
13
Mark Ransom

L'objet Image possède un attribut filename.

 from PIL import Image


 def foo_img(img_input):
     print(img_input.filename)

 foo_img(Image.open('/path/to/some/img.img'))  
4
dasdachs

Une autre façon de procéder est d'utiliser l'emplacement initial du fichier:

def getImageName(file_location):
    filename = file_location.split('/')[-1]
    location = file_location.split('/')[0:-1]
    filename = filename.split('.')
    filename[0] += "_resized"
    filename = '.'.join(filename)
    new_path = '/'.join(location) + '/' + filename
    return new_path
0
Nicolae