diff --git a/apps/gui/src-tauri/icons/128x128.png b/apps/gui/src-tauri/icons/128x128.png index f0f7d52..ef756dc 100644 Binary files a/apps/gui/src-tauri/icons/128x128.png and b/apps/gui/src-tauri/icons/128x128.png differ diff --git a/apps/gui/src-tauri/icons/128x128@2x.png b/apps/gui/src-tauri/icons/128x128@2x.png index c7286e0..a75408d 100644 Binary files a/apps/gui/src-tauri/icons/128x128@2x.png and b/apps/gui/src-tauri/icons/128x128@2x.png differ diff --git a/apps/gui/src-tauri/icons/32x32.png b/apps/gui/src-tauri/icons/32x32.png index 000671a..51897bb 100644 Binary files a/apps/gui/src-tauri/icons/32x32.png and b/apps/gui/src-tauri/icons/32x32.png differ diff --git a/apps/gui/src-tauri/icons/64x64.png b/apps/gui/src-tauri/icons/64x64.png index bc7cb21..e2f298e 100644 Binary files a/apps/gui/src-tauri/icons/64x64.png and b/apps/gui/src-tauri/icons/64x64.png differ diff --git a/apps/gui/src-tauri/icons/Square107x107Logo.png b/apps/gui/src-tauri/icons/Square107x107Logo.png index 87e9885..b9d6c35 100644 Binary files a/apps/gui/src-tauri/icons/Square107x107Logo.png and b/apps/gui/src-tauri/icons/Square107x107Logo.png differ diff --git a/apps/gui/src-tauri/icons/Square142x142Logo.png b/apps/gui/src-tauri/icons/Square142x142Logo.png index 056874c..a6cb4fa 100644 Binary files a/apps/gui/src-tauri/icons/Square142x142Logo.png and b/apps/gui/src-tauri/icons/Square142x142Logo.png differ diff --git a/apps/gui/src-tauri/icons/Square150x150Logo.png b/apps/gui/src-tauri/icons/Square150x150Logo.png index b1a899a..728ee16 100644 Binary files a/apps/gui/src-tauri/icons/Square150x150Logo.png and b/apps/gui/src-tauri/icons/Square150x150Logo.png differ diff --git a/apps/gui/src-tauri/icons/Square284x284Logo.png b/apps/gui/src-tauri/icons/Square284x284Logo.png index b83ad1e..494fe77 100644 Binary files a/apps/gui/src-tauri/icons/Square284x284Logo.png and b/apps/gui/src-tauri/icons/Square284x284Logo.png differ diff --git a/apps/gui/src-tauri/icons/Square30x30Logo.png b/apps/gui/src-tauri/icons/Square30x30Logo.png index 696f4ca..7cdb6b5 100644 Binary files a/apps/gui/src-tauri/icons/Square30x30Logo.png and b/apps/gui/src-tauri/icons/Square30x30Logo.png differ diff --git a/apps/gui/src-tauri/icons/Square310x310Logo.png b/apps/gui/src-tauri/icons/Square310x310Logo.png index 0e39289..cdeb166 100644 Binary files a/apps/gui/src-tauri/icons/Square310x310Logo.png and b/apps/gui/src-tauri/icons/Square310x310Logo.png differ diff --git a/apps/gui/src-tauri/icons/Square44x44Logo.png b/apps/gui/src-tauri/icons/Square44x44Logo.png index 15bd6a4..97784c2 100644 Binary files a/apps/gui/src-tauri/icons/Square44x44Logo.png and b/apps/gui/src-tauri/icons/Square44x44Logo.png differ diff --git a/apps/gui/src-tauri/icons/Square71x71Logo.png b/apps/gui/src-tauri/icons/Square71x71Logo.png index c6291ad..93eb8a3 100644 Binary files a/apps/gui/src-tauri/icons/Square71x71Logo.png and b/apps/gui/src-tauri/icons/Square71x71Logo.png differ diff --git a/apps/gui/src-tauri/icons/Square89x89Logo.png b/apps/gui/src-tauri/icons/Square89x89Logo.png index 10c20f2..8e41fc7 100644 Binary files a/apps/gui/src-tauri/icons/Square89x89Logo.png and b/apps/gui/src-tauri/icons/Square89x89Logo.png differ diff --git a/apps/gui/src-tauri/icons/StoreLogo.png b/apps/gui/src-tauri/icons/StoreLogo.png index b2a02fc..b905006 100644 Binary files a/apps/gui/src-tauri/icons/StoreLogo.png and b/apps/gui/src-tauri/icons/StoreLogo.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png b/apps/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png index 855a48d..de4e6a2 100644 Binary files a/apps/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png and b/apps/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png b/apps/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png index 5d36c17..08052d7 100644 Binary files a/apps/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png and b/apps/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png b/apps/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png index 728cb9f..0268be8 100644 Binary files a/apps/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png and b/apps/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png b/apps/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png index a5c12c5..32e364a 100644 Binary files a/apps/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png and b/apps/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png b/apps/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png index 20a4cae..e68c103 100644 Binary files a/apps/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png and b/apps/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png b/apps/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png index 682651b..b8f0ea3 100644 Binary files a/apps/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png and b/apps/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png b/apps/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png index b36b9f8..42c7e27 100644 Binary files a/apps/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png and b/apps/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png b/apps/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png index 8a0440b..27ed72a 100644 Binary files a/apps/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png and b/apps/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png b/apps/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png index 053a087..c095b7f 100644 Binary files a/apps/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png and b/apps/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png b/apps/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png index 1da18ca..b26f803 100644 Binary files a/apps/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png and b/apps/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png b/apps/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png index ac2264c..2169f7a 100644 Binary files a/apps/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png and b/apps/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png b/apps/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png index 07a71ab..0278ec6 100644 Binary files a/apps/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png and b/apps/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png b/apps/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png index e7906b8..f7b07de 100644 Binary files a/apps/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png and b/apps/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png b/apps/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png index 6bfae86..db514e3 100644 Binary files a/apps/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png and b/apps/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png b/apps/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png index c47d28b..7efc1a7 100644 Binary files a/apps/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png and b/apps/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/apps/gui/src-tauri/icons/icon.icns b/apps/gui/src-tauri/icons/icon.icns index 4739cfb..dca3f15 100644 Binary files a/apps/gui/src-tauri/icons/icon.icns and b/apps/gui/src-tauri/icons/icon.icns differ diff --git a/apps/gui/src-tauri/icons/icon.ico b/apps/gui/src-tauri/icons/icon.ico index 0637d0c..8a04178 100644 Binary files a/apps/gui/src-tauri/icons/icon.ico and b/apps/gui/src-tauri/icons/icon.ico differ diff --git a/apps/gui/src-tauri/icons/icon.png b/apps/gui/src-tauri/icons/icon.png index c04de5c..5aacf78 100644 Binary files a/apps/gui/src-tauri/icons/icon.png and b/apps/gui/src-tauri/icons/icon.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-20x20@1x.png b/apps/gui/src-tauri/icons/ios/AppIcon-20x20@1x.png index 34d1c0d..6a69dda 100644 Binary files a/apps/gui/src-tauri/icons/ios/AppIcon-20x20@1x.png and b/apps/gui/src-tauri/icons/ios/AppIcon-20x20@1x.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-20x20@2x-1.png b/apps/gui/src-tauri/icons/ios/AppIcon-20x20@2x-1.png index 115c7a2..de729e3 100644 Binary files a/apps/gui/src-tauri/icons/ios/AppIcon-20x20@2x-1.png and b/apps/gui/src-tauri/icons/ios/AppIcon-20x20@2x-1.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-20x20@2x.png b/apps/gui/src-tauri/icons/ios/AppIcon-20x20@2x.png index 115c7a2..de729e3 100644 Binary files a/apps/gui/src-tauri/icons/ios/AppIcon-20x20@2x.png and b/apps/gui/src-tauri/icons/ios/AppIcon-20x20@2x.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-20x20@3x.png b/apps/gui/src-tauri/icons/ios/AppIcon-20x20@3x.png index bf54c1e..f994821 100644 Binary files a/apps/gui/src-tauri/icons/ios/AppIcon-20x20@3x.png and b/apps/gui/src-tauri/icons/ios/AppIcon-20x20@3x.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-29x29@1x.png b/apps/gui/src-tauri/icons/ios/AppIcon-29x29@1x.png index 025cfac..1640d31 100644 Binary files a/apps/gui/src-tauri/icons/ios/AppIcon-29x29@1x.png and b/apps/gui/src-tauri/icons/ios/AppIcon-29x29@1x.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-29x29@2x-1.png b/apps/gui/src-tauri/icons/ios/AppIcon-29x29@2x-1.png index 718ec62..272ba33 100644 Binary files a/apps/gui/src-tauri/icons/ios/AppIcon-29x29@2x-1.png and b/apps/gui/src-tauri/icons/ios/AppIcon-29x29@2x-1.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-29x29@2x.png b/apps/gui/src-tauri/icons/ios/AppIcon-29x29@2x.png index 718ec62..272ba33 100644 Binary files a/apps/gui/src-tauri/icons/ios/AppIcon-29x29@2x.png and b/apps/gui/src-tauri/icons/ios/AppIcon-29x29@2x.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-29x29@3x.png b/apps/gui/src-tauri/icons/ios/AppIcon-29x29@3x.png index eefb245..418868e 100644 Binary files a/apps/gui/src-tauri/icons/ios/AppIcon-29x29@3x.png and b/apps/gui/src-tauri/icons/ios/AppIcon-29x29@3x.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-40x40@1x.png b/apps/gui/src-tauri/icons/ios/AppIcon-40x40@1x.png index 115c7a2..de729e3 100644 Binary files a/apps/gui/src-tauri/icons/ios/AppIcon-40x40@1x.png and b/apps/gui/src-tauri/icons/ios/AppIcon-40x40@1x.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-40x40@2x-1.png b/apps/gui/src-tauri/icons/ios/AppIcon-40x40@2x-1.png index e144fba..49df04b 100644 Binary files a/apps/gui/src-tauri/icons/ios/AppIcon-40x40@2x-1.png and b/apps/gui/src-tauri/icons/ios/AppIcon-40x40@2x-1.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-40x40@2x.png b/apps/gui/src-tauri/icons/ios/AppIcon-40x40@2x.png index e144fba..49df04b 100644 Binary files a/apps/gui/src-tauri/icons/ios/AppIcon-40x40@2x.png and b/apps/gui/src-tauri/icons/ios/AppIcon-40x40@2x.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-40x40@3x.png b/apps/gui/src-tauri/icons/ios/AppIcon-40x40@3x.png index 99a1920..d0763ea 100644 Binary files a/apps/gui/src-tauri/icons/ios/AppIcon-40x40@3x.png and b/apps/gui/src-tauri/icons/ios/AppIcon-40x40@3x.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-512@2x.png b/apps/gui/src-tauri/icons/ios/AppIcon-512@2x.png index 9a72162..e5eca8d 100644 Binary files a/apps/gui/src-tauri/icons/ios/AppIcon-512@2x.png and b/apps/gui/src-tauri/icons/ios/AppIcon-512@2x.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-60x60@2x.png b/apps/gui/src-tauri/icons/ios/AppIcon-60x60@2x.png index 99a1920..d0763ea 100644 Binary files a/apps/gui/src-tauri/icons/ios/AppIcon-60x60@2x.png and b/apps/gui/src-tauri/icons/ios/AppIcon-60x60@2x.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-60x60@3x.png b/apps/gui/src-tauri/icons/ios/AppIcon-60x60@3x.png index e13e80d..a060297 100644 Binary files a/apps/gui/src-tauri/icons/ios/AppIcon-60x60@3x.png and b/apps/gui/src-tauri/icons/ios/AppIcon-60x60@3x.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-76x76@1x.png b/apps/gui/src-tauri/icons/ios/AppIcon-76x76@1x.png index fcce553..e38c3e3 100644 Binary files a/apps/gui/src-tauri/icons/ios/AppIcon-76x76@1x.png and b/apps/gui/src-tauri/icons/ios/AppIcon-76x76@1x.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-76x76@2x.png b/apps/gui/src-tauri/icons/ios/AppIcon-76x76@2x.png index 6929eac..8addd68 100644 Binary files a/apps/gui/src-tauri/icons/ios/AppIcon-76x76@2x.png and b/apps/gui/src-tauri/icons/ios/AppIcon-76x76@2x.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png b/apps/gui/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png index 240e17e..cab84d3 100644 Binary files a/apps/gui/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png and b/apps/gui/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png differ diff --git a/apps/gui/src-tauri/icons/source.png b/apps/gui/src-tauri/icons/source.png index f321593..c15f27b 100644 Binary files a/apps/gui/src-tauri/icons/source.png and b/apps/gui/src-tauri/icons/source.png differ diff --git a/apps/gui/ui/guara-s.png b/apps/gui/ui/guara-s.png index ae7b14e..a9d7588 100644 Binary files a/apps/gui/ui/guara-s.png and b/apps/gui/ui/guara-s.png differ diff --git a/apps/gui/ui/guara.png b/apps/gui/ui/guara.png index 68737e0..bb767fc 100644 Binary files a/apps/gui/ui/guara.png and b/apps/gui/ui/guara.png differ diff --git a/assets/logo/guara-fonte.png b/assets/logo/guara-fonte.png deleted file mode 100644 index 601bdc5..0000000 Binary files a/assets/logo/guara-fonte.png and /dev/null differ diff --git a/scripts/gerar-logo.py b/scripts/gerar-logo.py new file mode 100644 index 0000000..ddb4e0a --- /dev/null +++ b/scripts/gerar-logo.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python3 +"""Gera, a partir da logo oficial, os arquivos derivados usados no app e nos ícones. + +A logo oficial é apps/gui/ui/guara.png (RGBA, fundo transparente, serve aos temas claro e escuro). +Ela não é alterada aqui. Saída: + apps/gui/ui/guara-s.png 128 px, recortada e quadrada (barra lateral e favicon) + apps/gui/src-tauri/icons/source.png 1024 px, a arte sobre o fundo escuro com cantos arredondados; + o CI e `npx @tauri-apps/cli icon` geram o resto dos ícones. + +Uso: python3 scripts/gerar-logo.py +""" +import os +from PIL import Image, ImageDraw + +RAIZ = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..") +UI = os.path.join(RAIZ, "apps/gui/ui") +ICONES = os.path.join(RAIZ, "apps/gui/src-tauri/icons") +FUNDO_ICONE = (10, 16, 28) # o azul-noite do fundo da arte original + + +def recortar_quadrado(im, margem=0.04): + """Recorta no que é visível (opacidade > 16, ignora resquícios) e centraliza num quadrado.""" + box = im.getchannel("A").point(lambda v: 255 if v > 16 else 0).getbbox() + im = im.crop(box) + w, h = im.size + lado = round(max(w, h) * (1 + 2 * margem)) + quadro = Image.new("RGBA", (lado, lado), (0, 0, 0, 0)) + quadro.paste(im, ((lado - w) // 2, (lado - h) // 2), im) + return quadro + + +def main(): + logo = recortar_quadrado(Image.open(os.path.join(UI, "guara.png")).convert("RGBA")) + logo.resize((128, 128), Image.LANCZOS).save(os.path.join(UI, "guara-s.png"), optimize=True) + print("guara-s.png") + + lado = 1024 + fundo = Image.new("RGBA", (lado, lado), FUNDO_ICONE + (255,)) + arte = logo.resize((round(lado * 0.82),) * 2, Image.LANCZOS) + fundo.paste(arte, ((lado - arte.width) // 2, (lado - arte.height) // 2), arte) + mascara = Image.new("L", (lado, lado), 0) + ImageDraw.Draw(mascara).rounded_rectangle((0, 0, lado - 1, lado - 1), radius=round(lado * 0.2237), fill=255) + icone = Image.new("RGBA", (lado, lado), (0, 0, 0, 0)) + icone.paste(fundo, (0, 0), mascara) + icone.save(os.path.join(ICONES, "source.png"), optimize=True) + print("icons/source.png") + + +if __name__ == "__main__": + main() diff --git a/scripts/processar-logo.py b/scripts/processar-logo.py deleted file mode 100644 index 35b781b..0000000 --- a/scripts/processar-logo.py +++ /dev/null @@ -1,182 +0,0 @@ -#!/usr/bin/env python3 -"""Tira o fundo da logo do Guará e gera os arquivos usados no app, no README e nos ícones. - -Entrada (arte original, fundo sólido escuro): assets/logo/guara-fonte.png. -Saída: apps/gui/ui/guara.png (768 px, fundo transparente, recortada e quadrada), guara-s.png -(128 px, para a barra lateral e o favicon) e apps/gui/src-tauri/icons/source.png (ícone do app, -sobre o fundo escuro da arte; o CI gera o resto com `tauri icon`). Uma logo só serve aos temas -claro e escuro: o laranja lê bem nos dois. - -O fundo é uma cor sólida: sai o que é parecido com ela e está ligado à borda da imagem (sombras -escuras dentro do desenho ficam). Na faixa de 3 px ao redor, a cor do desenho é estimada pelos -vizinhos internos e a transparência vem de onde o pixel cai entre o fundo e essa cor, o que evita -halo escuro ou claro. - -Uso: python3 scripts/processar-logo.py -""" -import os -from PIL import Image - -RAIZ = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..") -UI = os.path.join(RAIZ, "apps/gui/ui") -ICONES = os.path.join(RAIZ, "apps/gui/src-tauri/icons") -FONTE = "assets/logo/guara-fonte.png" -FUNDO = (10, 16, 28) # cor do fundo sólido da arte original -LIMIAR = 9.0 # distância que ainda conta como fundo certo - - -def tirar_fundo(path, bg, d0, _d1=None): - """Remove o fundo conectado à borda e refina a faixa de 3 px ao redor do desenho. - - 1. Fundo certo: pixels a menos de `d0` da cor do fundo, ligados à borda da imagem ou formando - um bolsão grande (as frestas entre as pernas). Sombras escuras do desenho, que passam de - `d0`, não são tocadas. - 2. Faixa de 3 px ao redor do fundo (a borda suavizada da arte): a cor verdadeira do desenho é - estimada pelos vizinhos internos mais próximos, e a opacidade sai da projeção do pixel - entre a cor do fundo e essa cor. Sem halo escuro ou claro. - 3. O resto fica como está, opaco. - """ - from collections import deque - - im = Image.open(path).convert("RGB") - w, h = im.size - px = im.load() - br, bgc, bb = bg - d0sq = d0 * d0 - - def perto(x, y): - r, g, b = px[x, y] - return (r - br) ** 2 + (g - bgc) ** 2 + (b - bb) ** 2 < d0sq - - # 1) fundo certo: flood fill a partir da borda - fundo = bytearray(w * h) - visto = bytearray(w * h) - fila = deque() - for x in range(w): - for y in (0, h - 1): - if perto(x, y) and not fundo[y * w + x]: - fundo[y * w + x] = 1 - fila.append((x, y)) - for y in range(h): - for x in (0, w - 1): - if perto(x, y) and not fundo[y * w + x]: - fundo[y * w + x] = 1 - fila.append((x, y)) - while fila: - x, y = fila.popleft() - for nx, ny in ((x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)): - if 0 <= nx < w and 0 <= ny < h and not fundo[ny * w + nx] and perto(nx, ny): - fundo[ny * w + nx] = 1 - fila.append((nx, ny)) - - # 1b) bolsões de fundo dentro do desenho (frestas entre as pernas, por exemplo): regiões grandes - # com a cor do fundo que não tocam a borda. Manchas pequenas (brilho do olho) ficam. - for i0 in range(w * h): - if fundo[i0] or visto[i0]: - continue - x0, y0 = i0 % w, i0 // w - if not perto(x0, y0): - continue - comp = [(x0, y0)] - visto[i0] = 1 - k = 0 - while k < len(comp): - x, y = comp[k] - k += 1 - for nx, ny in ((x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)): - if 0 <= nx < w and 0 <= ny < h and not visto[ny * w + nx] and not fundo[ny * w + nx] and perto(nx, ny): - visto[ny * w + nx] = 1 - comp.append((nx, ny)) - if len(comp) >= 60: - for x, y in comp: - fundo[y * w + x] = 1 - - # 2) distância (em passos de 8 vizinhos) até o fundo, só até 3 - dist = bytearray([255]) * (w * h) - fila = deque() - for i in range(w * h): - if fundo[i]: - dist[i] = 0 - fila.append((i % w, i // w)) - while fila: - x, y = fila.popleft() - d = dist[y * w + x] - if d >= 3: - continue - for dx in (-1, 0, 1): - for dy in (-1, 0, 1): - nx, ny = x + dx, y + dy - if 0 <= nx < w and 0 <= ny < h and dist[ny * w + nx] == 255: - dist[ny * w + nx] = d + 1 - fila.append((nx, ny)) - - out = Image.new("RGBA", (w, h)) - po = out.load() - R = 6 - for y in range(h): - for x in range(w): - d = dist[y * w + x] - if d == 0: - po[x, y] = (0, 0, 0, 0) - elif d == 255: - r, g, b = px[x, y] - po[x, y] = (r, g, b, 255) - else: # faixa da borda - soma = [0, 0, 0] - n = 0 - melhor = 99 - for yy in range(max(0, y - R), min(h, y + R + 1)): - for xx in range(max(0, x - R), min(w, x + R + 1)): - if dist[yy * w + xx] == 255: - q = (xx - x) ** 2 + (yy - y) ** 2 - if q < melhor: - melhor, soma, n = q, list(px[xx, yy]), 1 - elif q == melhor: - c = px[xx, yy] - soma = [soma[0] + c[0], soma[1] + c[1], soma[2] + c[2]] - n += 1 - r, g, b = px[x, y] - if n == 0: - po[x, y] = (r, g, b, 255) - continue - f = (soma[0] / n, soma[1] / n, soma[2] / n) - vx, vy, vz = f[0] - br, f[1] - bgc, f[2] - bb - nn = vx * vx + vy * vy + vz * vz - a = ((r - br) * vx + (g - bgc) * vy + (b - bb) * vz) / nn if nn else 1.0 - a = 0.0 if a < 0.02 else 1.0 if a > 0.98 else a - po[x, y] = (round(f[0]), round(f[1]), round(f[2]), round(a * 255)) - return out - - -def recortar_quadrado(im, margem=0.04, lado=1024): - box = im.getchannel("A").point(lambda v: 255 if v > 8 else 0).getbbox() - im = im.crop(box) - w, h = im.size - s = round(max(w, h) * (1 + 2 * margem)) - quadro = Image.new("RGBA", (s, s), (0, 0, 0, 0)) - quadro.paste(im, ((s - w) // 2, (s - h) // 2), im) - return quadro.resize((lado, lado), Image.LANCZOS) - - -def main(): - logo = recortar_quadrado(tirar_fundo(os.path.join(RAIZ, FONTE), FUNDO, LIMIAR)) - for sufixo, lado in (("", 768), ("-s", 128)): - logo.resize((lado, lado), Image.LANCZOS).save(os.path.join(UI, f"guara{sufixo}.png"), optimize=True) - print("guara.png e guara-s.png") - # ícone do app: a arte sobre o fundo escuro da própria arte, com cantos arredondados - from PIL import ImageDraw - - lado = 1024 - fundo = Image.new("RGBA", (lado, lado), FUNDO + (255,)) - arte = logo.resize((round(lado * 0.82),) * 2, Image.LANCZOS) - fundo.paste(arte, ((lado - arte.width) // 2, (lado - arte.height) // 2), arte) - mascara = Image.new("L", (lado, lado), 0) - ImageDraw.Draw(mascara).rounded_rectangle((0, 0, lado - 1, lado - 1), radius=round(lado * 0.2237), fill=255) - icone = Image.new("RGBA", (lado, lado), (0, 0, 0, 0)) - icone.paste(fundo, (0, 0), mascara) - icone.save(os.path.join(ICONES, "source.png"), optimize=True) - print("icons/source.png", icone.size) - - -if __name__ == "__main__": - main()