Try   HackMD

Sesc - Programação para Ilustradores

Edição de imagens com Programação

hackmd.io/@villares/prog-ilustra-e4

Apresentando rapidamente pathlib.Path

# para iterar por uma pasta >>> for p in Path.cwd().iterdir(): print(p) ... lista itens do diretório atual caminho = Path('image.png') caminho.absolute().parent # pasta onde está a imagem caminho.suffix # extensao caminho.stem # nome sem extensão caminho.name # nome do arquivo só (sem o resto do caminho) # dá pra concatenar caminhos com / novo_na_mesma_pasta = caminho.absolute().parent / 'novo_nome.png'

Como fazer thumbnails com Python

from pathlib import Path # standard libray from PIL import Image # Pillow def setup(): size(800, 400) caminho_imagem = Path('piscina-praticas.jpg') nome, extensao = caminho_imagem.stem, caminho_imagem.suffix print(nome, extensao) destino = save_thumb(caminho_imagem) img = load_image(caminho_imagem) thumb = load_image(destino) image(img, 0, 0) image(thumb, 0, 0) def save_thumb(caminho_arquivo, tamanho_maximo=(200, 200)): caminho_destino = caminho_arquivo.parent / (caminho_arquivo.stem + '_thumb.png') try: im = Image.open(caminho_arquivo) im.thumbnail(tamanho_maximo, Image.Resampling.LANCZOS) im.save(caminho_destino, "PNG") except IOError as erro: print(erro) exit_sketch() return caminho_destino

Selecionando uma pasta e processando diversas imagens

Baseado neste exemplo

Encontrando todos os arquivos de imagem em uma pasta

from pathlib import Path

def setup():
    size(500, 500)
    caminho_pasta = Path('imagens')
    for caminho_imagem in lista_imagens(caminho_pasta):
        print(caminho_imagem)
        
def lista_imagens(caminho_pasta):
    extensoes_validas = ('.jpg', '.png', '.jpeg', '.gif', '.tif', '.tga')
    lista_caminhos = []
    for caminho_imagem in caminho_pasta.iterdir():
        if caminho_imagem.is_file() and caminho_imagem.suffix.lower() in extensoes_validas:
            lista_caminhos.append(caminho_imagem)
    return lista_caminhos

Versão recursiva

from pathlib import Path def setup(): size(500, 500) caminho_pasta = Path('imagens') for caminho_imagem in lista_imagens(caminho_pasta, recursiva=True): print(caminho_imagem) def lista_imagens(caminho, recursiva=True): extensoes_validas = ('.jpg', '.jpeg', '.png', '.gif') lista_caminhos = [] if caminho.is_dir(): for path_item in caminho.iterdir(): if not recursiva and path_item.is_dir(): continue lista_caminhos.extend(lista_imagens(path_item)) elif caminho.is_file() and caminho.suffix in extensoes_validas: return [caminho] else: return [] return lista_caminhos

Um exemplo mais complexo mas que permite selecionar a pasta

from pathlib import Path imagens = [] # lista vazia que vai receber tuplas (nome-string, objetos-Py5Image) def setup(): size(500, 500) def draw(): pass def key_pressed(): if key == 'o': select_folder("Selecione uma pasta", carregar_imagens) if key == ' ': imagens[:] = [] # esvazia a lista de imagens def carregar_imagens(caminho_pasta): if caminho_pasta == None: print("Seleção cancelada.") else: print("Pasta selecionada: " + caminho_pasta.name) for caminho_imagem in lista_imagens(caminho_pasta): img = load_image(caminho_imagem) print(f'imagem {caminho_imagem.name} carregada.') imagens.append((caminho_imagem.name, img)) print(f'Número de imagens: {len(imagens)}') def lista_imagens(caminho_pasta): extensoes_validas = ('.jpg', '.png', '.jpeg', '.gif', '.tif', '.tga') lista_caminhos = [] for caminho_imagem in caminho_pasta.iterdir(): if caminho_imagem.is_file() and caminho_imagem.suffix.lower() in extensoes_validas: lista_caminhos.append(caminho_imagem) return lista_caminhos

Mais uma variante com try:

from pathlib import Path imagens = [] def setup(): size(1000, 500) def draw(): x = 0 for img in imagens: image(img, x, 0) x = xo + 100 def key_pressed(): if key == 'o': select_folder('Selecione uma pasta com imagens', adiciona_imagens) def adiciona_imagens(caminho_pasta): if caminho_pasta is None: print('Operação cancelada.') else: print(f'vamos olhar {caminho_pasta}') for caminho_imagem in lista_imagens(caminho_pasta, recursiva=True): try: img = load_image(caminho_imagem) imagens.append(img) print(caminho_imagem.name) except Exception as erro: print(erro) def lista_imagens(caminho, recursiva=True): extensoes_validas = ('.jpg', '.jpeg', '.png', '.gif') lista_caminhos = [] if caminho.is_dir(): for path_item in caminho.iterdir(): if not recursiva and path_item.is_dir(): continue lista_caminhos.extend(lista_imagens(path_item)) elif caminho.is_file() and caminho.suffix in extensoes_validas: return [caminho] else: return [] return lista_caminhos

Exemplo de processar várias imagens

from pathlib import Path

imagens = []

def setup():
    size(1000, 500)
    no_smooth()
    
def draw():
    #background(200)
    y = 100
    fill(0)
    for img in imagens:
        text(img, 50, y)
        y += 20
    
def key_pressed():
    if key == 'o':
        select_folder('Selecione uma pasta com imagens', processa_imagens)
        
def processa_imagens(caminho_pasta):
    if caminho_pasta is None:
        print('Operação cancelada.')
    else:
        print(f'vamos processar {caminho_pasta}')
        pasta_saida = caminho_pasta.parent / 'imagens_processadas'
        for caminho_imagem in lista_imagens(caminho_pasta, recursiva=True):
            try:
                img = load_image(caminho_imagem)
                pasta_imagem = caminho_imagem.parent 
                caminho_saida = pasta_saida / pasta_imagem.relative_to(caminho_pasta)
                caminho_saida.mkdir(parents=True, exist_ok=True)        
                apply_threshold_and_save(
                    img, 128, caminho_saida / caminho_imagem.name
                    )
                imagens.append(caminho_imagem.name)
                print(caminho_saida)
            except Exception as erro:
                print(erro)
    
def lista_imagens(caminho, recursiva=True):
    extensoes_validas = ('.jpg', '.jpeg', '.png', '.gif')
    lista_caminhos = []
    if caminho.is_dir():
        for path_item in caminho.iterdir():
            if not recursiva and path_item.is_dir():
                continue
            lista_caminhos.extend(lista_imagens(path_item))
    elif caminho.is_file() and caminho.suffix in extensoes_validas:
        return [caminho]
    else:
        return []
    
    return lista_caminhos

def apply_threshold_and_save(img, threshold, caminho_saida):
    img.load_np_pixels()
    img_array = img.np_pixels
    new_array = np.where(img_array > threshold, 255, 0)
    img.set_np_pixels(new_array, bands='ARGB')
    img.save(caminho_saida)
    #image(img, 0, 0)  # ver na tela o último resultado