-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrename_wallpapers.py
More file actions
106 lines (83 loc) · 3.43 KB
/
rename_wallpapers.py
File metadata and controls
106 lines (83 loc) · 3.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import os
import re
from PIL import Image
from transformers import BlipProcessor, BlipForConditionalGeneration
import torch
from datetime import datetime
# Inicializa o modelo e processador BLIP
processor = BlipProcessor.from_pretrained("Salesforce/blip-image-captioning-base", use_fast=True)
model = BlipForConditionalGeneration.from_pretrained("Salesforce/blip-image-captioning-base")
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
EXTENSOES_VALIDAS = {'.jpg', '.jpeg', '.png', '.webp', '.bmp', '.tiff'}
WALLPAPER_DIR = "wallpapers"
DESTINO_RENOMEADOS = "renomeados"
def gerar_sufixo_contador(contador):
"""
Retorna um sufixo com data atual e número sequencial formatado (ex: 290524_001)
"""
data = datetime.now().strftime("%d%m%y")
return f"{data}_{contador:03d}"
def gerar_nome_descritivo(imagem_path):
"""
Gera uma descrição textual da imagem usando BLIP.
"""
image = Image.open(imagem_path).convert('RGB')
inputs = processor(images=image, return_tensors="pt").to(device)
out = model.generate(**inputs)
caption = processor.decode(out[0], skip_special_tokens=True)
return caption
def limpar_nome(nome):
"""
Gera um nome com no mínimo 4 palavras e exatamente 25 caracteres.
Preenche com palavras genéricas se necessário e trunca corretamente.
"""
stopwords = {"a", "the", "of", "in", "on", "with", "and", "to", "at", "by", "for", "an", "into", "over", "under", "from"}
palavras_reserva = ["wallpaper", "background", "scene", "image", "landscape", "view"]
nome = nome.lower()
palavras = re.findall(r'\b\w+\b', nome)
palavras = [p for p in palavras if p not in stopwords]
seen = set()
palavras_unicas = []
for p in palavras:
if p not in seen:
palavras_unicas.append(p)
seen.add(p)
while len(palavras_unicas) < 4:
for extra in palavras_reserva:
if extra not in palavras_unicas:
palavras_unicas.append(extra)
if len(palavras_unicas) == 4:
break
for i in range(4, 0, -1):
tentativa = "-".join(palavras_unicas[:i])
if len(tentativa) <= 25:
return tentativa.ljust(25, "-")
return "-".join(palavras_unicas)[:25]
def renomear_wallpapers():
"""
Processa imagens, gera nomes descritivos de 25 caracteres, converte para JPEG e salva com sufixo padronizado.
"""
contador = 1
os.makedirs(DESTINO_RENOMEADOS, exist_ok=True)
for nome_arquivo in os.listdir(WALLPAPER_DIR):
caminho_completo = os.path.join(WALLPAPER_DIR, nome_arquivo)
if (
not os.path.isfile(caminho_completo)
or os.path.splitext(nome_arquivo)[1].lower() not in EXTENSOES_VALIDAS
):
continue
try:
descricao = gerar_nome_descritivo(caminho_completo)
nome_limpo = limpar_nome(descricao)
sufixo = gerar_sufixo_contador(contador)
contador += 1
novo_nome = f"{nome_limpo}-{sufixo}.jpg"
novo_caminho = os.path.join(DESTINO_RENOMEADOS, novo_nome)
imagem = Image.open(caminho_completo).convert("RGB")
imagem.save(novo_caminho, format="JPEG", quality=90)
print(f"Convertido e renomeado: {nome_arquivo} → {novo_nome}")
except Exception as e:
print(f"Erro com {nome_arquivo}: {e}")
if __name__ == "__main__":
renomear_wallpapers()