Introdução à programação
com Python em um contexto visual


Lendo todas as imagens da pasta data

imagens sorteadas da pasta

Exemplo de execução usando imagens medievais coletadas pelo artista e educador Daniel Seda.

Tendo visto previamente como ler e usar imagens de arquivos externos com loadImage(), e a estrutura de dados lista (list) neste exemplo vamos carregar todas as imagens encontradas na pasta data localizada dentro da pasta do seu sketch. Depois vamos “sortear”, uma imagem para mostrar usando a função random.choice. A cada clique do mouse uma nova imagem será mostrada.

Para começar, é preciso criar uma variável global para guardar os dados das imagens carregados dos arquivos encontrados, fazemos isso com a linha imagens = [] antes do setup() que cria uma lista vazia e aponta o nome imagens para ela.

Usaremos a função sketchPath() do Processing, com o argumento 'data' para obter o caminho da pasta data dentro do seu sketch. E vamos também usar funções importadas, trazidas, do módulo osdo Python para:

Depois do procedimento que popula a lista caminhos_arquivos, que contém o caminho completo para os arquivos de imagem (localização da pasta + nome do arquivo), nós vamos pegar cada um desses caminhos e usá-lo para carregar os dados da imagem com a função loadImage() do Processing. Essa função devolve um objeto PImage que pode ser mostrado na tela com a função image() posteriormente.

import os  # para usar listdir, path.isfile, path.join
from random import choice

imagens = []  # lista que vai receber objetos PImage (Processing Image data)

def setup():
    size(400, 400)
    # Ponha as imagens na pasta /data/ dentro da pasta do seu sketch
    data_folder = sketchPath('data')  # encontra o caminho da pasta 'data', não funciona fora do setup
    # Começa olhando para os itens da pasta, confere se é uma imagem e guarda na lista caminhos_arquivos
    caminhos_arquivos = []
    for nome_arquivo in os.listdir(data_folder):
        caminho_arquivo = os.path.join(data_folder, nome_arquivo)
        if os.path.isfile(caminho_arquivo) and has_image_ext(caminho_arquivo):
            caminhos_arquivos.append(caminho_arquivo)
    # Agora efetivamente carrega na memória cada imagem a partir dos caminhos listados no passo anterior
    for caminho_arquivo in caminhos_arquivos:
        img = loadImage(caminho_arquivo)
        imagens.append(img)
    # Vamos congelar a repetição do draw(), clique com o mouse para uma nova imagem (redraw)
    noLoop()  
        
def draw():
    background(0)
    random_image = choice(imagens)
    # Para encolher proporcionalmente a imagem caso ela não caiba na àrea de desenho
    fator_escala = 1 # caso a imagem caiba perfeitamente
    if random_image.width > width:   # se a largura for maior que a largura da tela
        fator_escala = float(width) / random_image.width
    if random_image.height * f > height:  # se mesmo tento sido já reduzida, a altura não couber
        fator_escala = float(height) / random_image.height
    # Mostra a imagem centrada na àrea de desenho
    imageMode(CENTER)
    image(random_image, width / 2, height / 2,
          random_image.width * fator_escala, random_image.height * fator_escala
                     
def mouseClicked():  # executada quando o mouse é clicado
    redraw()         # pede para executar mais um ciclo da função draw()
    
def has_image_ext(file_name):
    """Responde se a extansão do arquivo está na tupla contendo extensões válidas para imagens."""
    valid_ext = ('jpg', 'png', 'jpeg', 'gif', 'tif', 'tga')
    file_ext = file_name.split('.')[-1]
    return file_ext.lower() in valid_ext

Assuntos relacionados