# Sesc - Programação para Ilustradores ## Edição de imagens com Programação ## `hackmd.io/@villares/prog-ilustra-e4` ### Apresentando rapidamente `pathlib.Path` ```python= # 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 ```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](https://abav.lugaralgum.com/material-aulas/Processing-Python-py5/imagens_externas_pasta.html) ### Encontrando todos os arquivos de imagem em uma pasta ```python 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 ```python= 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 ```python= 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: ```python= 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 ```python 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 ```