个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证PhotoEditor é um sistema feito para otimizar a seleção e a edição rápida de fotos de eventos.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗PhotoEditor é um sistema livre (BSD 2-Clause), feito para
otimizar a seleção e a edição rápida de fotos de eventos. Em vez de abrir
centenas de arquivos um a um, você percorre o evento inteiro pelo teclado:
descarta as fotos ruins com Del (lixeira) ou as arquiva com Backspace,
aplica A (Auto) ou um preset, recorta com C, extrai uma pessoa ou objeto
numa camada com S e exporta tudo de uma vez, já no formato de publicação. A edição nunca altera os originais.
Foi criado por Helvio Junior para agilizar o fluxo das coberturas fotográficas do PhotoE — da triagem logo depois do evento até a pasta pronta para publicar.
Funciona como um aplicativo normal no Windows, no macOS e no Linux: é só instalar e abrir — não precisa de internet, de navegador nem de conta. Tudo roda no seu computador, e as fotos nunca saem da pasta do evento.
Baixe o instalador do seu sistema na página de Releases (a versão mais recente fica no topo):
| Sistema | Arquivo | Como instalar |
|---|---|---|
| macOS (Apple Silicon — M1 ou mais novo) | PhotoEditor-<versão>-macos-arm64.dmg | abra o .dmg e arraste o PhotoEditor para Aplicativos |
| macOS (Intel) | PhotoEditor-<versão>-macos-x64.dmg | idem |
| Windows 10/11 (Intel/AMD) | PhotoEditor-<versão>-windows-x64.msi | abra o .msi; o atalho aparece no Menu Iniciar e na Área de Trabalho |
| Windows 11 em ARM | PhotoEditor-<versão>-windows-arm64.msi | idem |
| Linux x64 / arm64 | PhotoEditor-<versão>-linux-*.tar.gz | descompacte e rode bin/PhotoEditor |
Requisitos mínimos: macOS 14, Windows 10/11 64 bits, ou Linux com glibc 2.39 (Ubuntu 24.04).
Primeira abertura: os instaladores ainda não são assinados. No macOS, se aparecer "não foi possível verificar o desenvolvedor", vá em Ajustes do Sistema → Privacidade e Segurança → Abrir Mesmo Assim. No Windows, na tela do SmartScreen, clique em Mais informações → Executar assim mesmo. A primeira abertura também é mais lenta: o sistema verifica o app uma vez.
Para atualizar, instale a versão nova por cima — projetos e preferências são mantidos.
A tela inicial (Projetos, no trilho à esquerda) mostra Abrir projeto, Novo projeto e os projetos recentes em cards — com a capa, o número de fotos, o tamanho e a data da última abertura; o projeto aberto leva o selo Aberto:
Um projeto é a pasta de um evento:
<pasta do evento>/
raw/ as fotos originais (JPEG) — o editor nunca as altera
publicar/ as fotos prontas, geradas pelo botão Exportar
instagram/ as versões Instagram (1080 px, no formato do feed)
archived/ as fotos arquivadas (Backspace) — fora da filmstrip e do Exportar
deleted/ a lixeira (Del): as fotos excluídas, movidas para cá
project_data/ o catálogo e os ajustes do evento (não mexa)
raw/ e move as fotos para dentro; se já for um projeto,
só o abre; se estiver vazia, oferece copiar as fotos de outro lugar.raw/ (ou clique num
card dos recentes). Remover um card da lista nunca apaga a pasta.| Tecla | Ação |
|---|---|
← → | foto anterior / próxima (no recorte, gira o quadro de 15 em 15°) |
Backspace (Mac: ⌫) | arquiva a foto (vai para archived/) |
Del (Mac: fn+⌫) | manda a foto para a lixeira (deleted/) |
Ctrl/Cmd+Shift+R | restaura a foto arquivada ou da lixeira |
A | Auto |
C | modo recorte |
S | modo seleção (camadas); S de novo conclui |
L | próxima camada |
I | versão Instagram da foto (cria/abre); na versão, volta à foto |
[ ] | diminui / aumenta o pincel |
W | conta-gotas do balanço de branco |
Alt+1 … Alt+4 | abas Ajustes / Níveis / Curvas / Efeitos |
Ctrl/Cmd+Z | desfaz a última ação |
Ctrl/Cmd+Shift+Z (ou Ctrl/Cmd+Y) | refaz o que foi desfeito |
Ctrl/Cmd+D | duplica a foto (cópia virtual) |
Ctrl/Cmd+E | exporta |
Ctrl/Cmd+K | busca de ações (paleta de comandos) |
Ctrl/Cmd+/ | atalhos de teclado |
Buscar ações: a caixa no centro da barra superior (ou Ctrl/Cmd+K) abre
a paleta de comandos — digite parte do nome e Enter executa. Ela acha
qualquer ação do app, de "recorte" e presets a idioma e tema, e mostra o
atalho de cada uma; também entende o nome em inglês ("crop", "export"):
Os atalhos são editáveis: o ícone de teclado no pé do trilho lateral (ou
Ctrl/Cmd+/) abre a lista de ações por grupo. + grava uma tecla nova para a
ação, o × remove uma, e Restaurar tudo volta aos padrões. Uma tecla que já
era de outra ação passa para a nova, e o aviso diz quem a perdeu:
Original e editada lado a lado, painel de edição à direita (em abas: Ajustes, Níveis, Curvas e Efeitos) e a filmstrip do evento embaixo. Na barra superior ficam a busca de ações, Desfazer/Refazer e Exportar:
Modo recorte: o quadro fica sobre a original e a editada mostra o resultado ao vivo — aqui girado a -90°, trocando paisagem por retrato sem girar a imagem:
O painel de edição tem quatro abas (Alt+1 a Alt+4); a aba escolhida fica
salva. Tudo vale para a camada ativa, entra no histórico e no desfazer, e
arrastar mostra o resultado ao vivo na Editada.
W) transforma o cursor numa
cruz sobre a Original; clique numa área que deveria ser branca ou cinza
(camisa, parede, rede) e o app acha a temperatura e a matiz que a deixam
neutra. Um clique e o modo sai; Esc cancela. O ajuste fino fica nos
sliders Temperatura e Matiz, com o trilho colorido:S entra no modo seleção: pinte por cima de uma pessoa ou objeto na
original e ele vira uma camada, com ajustes próprios — o resto da foto
fica em outra, com os dela (ex.: fundo escuro e P&B, jogador em cor). Cada
traço soma à seleção; Subtrair (ou Alt) remove; [ e ] diminuem e
aumentam o pincel. L passa de uma camada
para a outra; sliders, presets, Auto, níveis, curvas e efeitos editam a
camada ativa.
Seleção: o traço do pincel (em vermelho, sobre a original) cobre o jogador e a IA estende a seleção ao objeto inteiro sob ele:
Resultado: o jogador virou a camada Seleção 1 e mantém a cor, enquanto o Restante da foto recebeu o preset P&B — o objeto é editado separado do fundo:
A IA que reconhece o objeto roda no seu computador, sem internet e sem
placa de vídeo: a primeira seleção de cada foto leva ~1,5 s e cada traço
seguinte, ~0,3 s. Com Detectar o objeto (IA) desligado, o pincel seleciona
exatamente a área pintada. As camadas entram no histórico, no desfazer
(Ctrl/Cmd+Z), no refazer e na exportação como qualquer ajuste.
Na triagem há dois destinos para a foto que não vai ser publicada:
Backspace; no Mac, ⌫): a foto sai da filmstrip e do
Exportar, e o JPEG vai de raw/ para archived/. Serve para a foto boa
que não entra nesta publicação, mas que vale guardar.Del; no Mac, fn+⌫): a foto vai para deleted/ — das fotos
ou do arquivo. Nada é apagado: a lixeira só junta o que foi descartado.Arquivar, mandar para a lixeira e restaurar entram no desfazer
(Ctrl/Cmd+Z) e no refazer.
A barra da filmstrip troca a visualização: Fotos | Arquivadas (n) |
Lixeira (n). Em Arquivadas e Lixeira as fotos só são vistas, não editadas;
Restaurar (Ctrl/Cmd+Shift+R) devolve a foto à filmstrip.
Na lixeira,
Excluir definitivamente apaga a foto atual e Esvaziar lixeira apaga
todas — o arquivo e o registro, com as cópias virtuais, as versões Instagram,
o histórico, a participação em merges e o que já foi exportado em
publicar/. Essas duas não têm desfazer: a confirmação pede que você
digite uma palavra (ou, ao esvaziar, o número de fotos da lixeira) antes de
liberar o botão.
O botão Duplicar da barra da filmstrip cria uma cópia virtual da foto:
uma entrada nova no catálogo, ao lado da original, que lê o mesmo JPEG
(nada é gravado em raw/) e tem ajustes, crop e camadas próprios —
começando pelos da foto duplicada. Serve para ter duas versões da mesma foto
(ex.: uma em cor e outra em P&B, ou dois cortes).
O Exportar grava a cópia como publicar/<nome>_copy.jpg (_copy2,
_copy3...). Excluir a cópia só a tira do catálogo; excluir a original tira
as cópias da filmstrip junto (desfazer traz tudo de volta). Ctrl/Cmd+Z
desfaz a duplicação.
Conectar a conta: o item Instagram do trilho lateral abre as
configurações do Instagram. Entre com usuário e senha; se a conta tiver
verificação em duas etapas, ou se o Instagram pedir para confirmar o acesso,
a tela pede o código. O app guarda só a sessão em ~/.photoe/ — nunca a
senha — e ela vale para todos os eventos. Na mesma tela fica o modelo da
legenda, com os campos {event} (nome da pasta do evento, sem a data),
{date}, {photos} e {hashtag}.
O login é o do app do celular, fora da API oficial da Meta (que só aceita fotos hospedadas na internet). O Instagram pode pedir confirmação ou limitar a conta por um tempo; publicar num ritmo normal evita isso.
Editar para o Instagram: tecle I (ou o ícone do Instagram na barra da
filmstrip) numa foto. O app cria a versão Instagram dela — uma cópia
virtual com todos os ajustes, camadas e o merge que a foto já tem — e a abre
no modo recorte, com o quadro preso aos formatos que o feed aceita:
4:5 (retrato), 1:1 ou 1,91:1 (paisagem). Escolha o formato no
painel; o resto do painel funciona como sempre. Em 4:5 e 1:1 o quadro gira
até 45° (só endireita); no 1,91:1 gira até 90°, como no recorte normal —
passando de 45° ele deita e o recorte fica vertical (1:1,91). Esse formato
é exportado, mas o feed não aceita: o painel avisa e o Publicar não deixa
enviá-lo. Aqui, a versão 4:5 de uma foto: o quadro retrato sobre a
original e, à direita, o recorte que vai para o feed:
I de novo volta à foto;
na foto, I abre a versão que já existe. A versão não aparece na filmstrip
— clicar numa foto ou andar com as setas abre sempre a foto, nunca o editor do
Instagram; a foto que tem versão leva o ícone do Instagram no canto. Dentro da
versão, Del a exclui (tira a foto da seleção do Instagram).
Exportar grava as versões em publicar/instagram/ com 1080 px de
largura (1080×1350, 1080×1080 ou 1080×566), e não na raiz de publicar/.
Publicar: o botão Publicar da barra da filmstrip abre o envio:
escolha as versões (até 10 — mais de uma vira carrossel, na ordem da
filmstrip), revise a legenda — já preenchida com os dados do evento — e
publique. O que vai para o Instagram é exatamente o arquivo de
publicar/instagram/.
O botão Exportar, no canto superior direito (ou Ctrl/Cmd+E, ou
Projetos → Exportar…), grava as fotos ativas, com os ajustes, recortes,
camadas e merges, em publicar/; as versões Instagram vão para
publicar/instagram/. Só é regravado o que mudou desde a última exportação, e
a foto excluída sai de publicar/. Fechar o diálogo não interrompe nada: a
exportação segue e o botão mostra o andamento. No fim, o resumo:
A estrela na barra da filmstrip marca a foto atual como capa (selo
"Capa" no thumbnail; só uma por projeto — marcar outra tira a anterior; é
desfazível com Ctrl/Cmd+Z). No Exportar a capa sai duas vezes em
publicar/: com o nome original, como toda foto, e como capa.jpg —
cópia idêntica (se a capa for base de um merge, a cópia é a do merge). Sem
capa, um capa.jpg antigo é removido.
No desktop, as divisões do editor são arrastáveis: fotos × filmstrip, Original × Editada e a largura do painel de edição. Os tamanhos ficam salvos no app; duplo clique numa divisória volta ao padrão, e as setas do teclado também a movem (com ela em foco).
Várias fotos da mesma jogada viram uma só, com o objeto de cada clique empilhado em camadas — a trajetória da bola sobre a cena parada.
S, o mesmo das
camadas, com o SAM) a bola de cada foto. Só a área pintada entra no
resultado. Na base, pinte a bola dela para esmaecê-la: o fundo por trás
vem de uma foto seguinte, onde a bola já saiu dali.Seleção da parte da imagem: com a camada IMG_5794 ativa, a original dela aparece à esquerda com a área pintada em vermelho — a bola chegando à cesta. Só esse recorte vai para o merge; o resto da foto serve apenas para alinhá-la à base. À direita, o Resultado já mostra a bola no lugar:
Camadas e opacidade: cada foto mostra como foi alinhada à base
(Alinhada: -0.1, 1.8 px · 0.01° · 100.00% = deslocamento, rotação e escala)
e a própria opacidade. Com Surgir, a bola da base (IMG_5788) fica a 47% e
as seguintes sobem — 57%, 75% e 100% — até a da cesta, inteira. Esmaecer
faz o contrário e Opacas deixa todas a 100%:
Efeito final: de volta ao editor, a base leva o selo MERGE na filmstrip e
a Editada passa a ser o merge — a trajetória da bola, do arremesso até a
cesta, numa foto só. Ajustes, recorte e Auto valem sobre ele, e o Exportar
grava publicar/IMG_5788_merge.jpg:
Não precisa de tripé: cada foto é alinhada automaticamente à base pelo fundo — deslocamento, rotação e escala, já que a câmera na mão anda entre um clique e outro — e a exposição é igualada, para a bola de cada foto cair no lugar certo da cena.
Os originais nunca mudam. A base passa a representar o merge: no editor, a
Editada mostra o merge (ajustes, crop e Auto valem sobre ele) e o
Exportar grava publicar/<base>_merge.jpg. As fotos das camadas saem da
filmstrip e do Exportar enquanto o merge existir. A lixeira de uma camada
(Remover do merge) tira só aquela foto da composição e a devolve à
filmstrip — na última camada, o merge inteiro é desfeito; Desfazer merge
devolve todas.
~/.photoe/ —
C:\Users\<você>\.photoe no Windows.~/.photoe/logs/).O app é C++20 + Qt 6 (QML), com OpenCV e ONNX Runtime; só a publicação no
Instagram usa um pequeno auxiliar em Python. Compilar, testar e gerar os
instaladores é pelo make (com Docker, sem instalar Qt na máquina):
make test # testes
make run # abre o app
make local # instalador só deste sistema e arquitetura, em dist/
make help # todos os alvos (make dmg, make windows, make linux, make dist...)
Arquitetura, empacotamento e versão estão em
docs/ARCHITECTURE.md; as convenções obrigatórias
do código, em CLAUDE.md. A versão anterior (Python + React)
fica na branch legacy.
Distribuído sob a licença BSD 2-Clause — veja LICENSE.
Criado por Helvio Junior para as coberturas do PhotoE.