Открытие нескольких изображений в PIL с помощью цикла for

#python #for-loop #variables #data-structures #python-imaging-library

#python #for-цикл #переменные #структуры данных #python-imaging-library

Вопрос:

Я должен открыть пару изображений с помощью PIL. Прямо сейчас у меня есть только 3 изображения, поэтому я открывал их таким образом, а не в цикле for:

 self.redpic = Image.open("red.png")
self.redpic = self.redpic.resize((100,100), Image.ANTIALIAS)
self.img1 = ImageTk.PhotoImage(self.redpic)
  

Но в будущем я буду открывать как минимум 20 изображений, поэтому я попробовал реализацию с циклом for:

 def process_image(self):
    for valx in range(5):
        self.numbering = "image"   str(valx);
        self.numbpng = numbering   ".png";
        self.numbering = Image.open(numbpng);
        self.numbering = self.numbering.resize((100,100), Image.ANTIALIAS)
        self.numbering= ImageTk.PhotoImage(self.numbering)
  

Но при этом я не получаю доступ к изображениям, которые я только что создал. Я читал о динамическом создании переменных и о том, что это не рекомендуется, поэтому мне было интересно, какой для меня был бы лучший способ получить доступ к, self.imagex где x — номер изображения. Я заранее знаю количество изображений.

Ответ №1:

Один из распространенных способов избежать динамического создания переменных — хранить элементы в каком-либо контейнере переменного размера, таком как tuple , list , dict и т.д.

Ниже приведен пример сохранения их в атрибуте экземпляра класса, который является list и называется self.images :

 from PIL import Image, ImageTk

class Class:
    def process_images(self, num_images):
        self.images = []
        for i in range(num_images):
            image_filename = "image%s.png" % i
            number_img = Image.open(image_filename).resize((100, 100), Image.ANTIALIAS)
            number_img = ImageTk.PhotoImage(number_img)
            self.images.append(number_img)

c = Class()
c.process_images(5)
  

После вызова метода вы можете ссылаться на отдельные изображения следующим образом:

 c.images[2]  # Third image.