GIF para sprite sheet
Converta um GIF animado num sprite sheet, ou um sprite sheet de volta em GIF. O sheet vem com metadados JSON no formato do Aseprite, que o Phaser, o PixiJS, o Godot e o Unity já leem — por isso a animação conserva a duração de cada frame em vez de a perder. Tudo corre no seu navegador e nenhum ficheiro é enviado.
Deixe em 0 para uma grelha quase quadrada, que é a que menos espaço de textura desperdiça.
A área do sheet é frames × largura × altura, seja qual for a grelha, por isso reduzir é a única forma de caber uma animação longa.
A separação entre células evita que a filtragem bilinear de um motor arraste píxeis do frame vizinho. A margem rodeia o sheet inteiro.
Como converter um GIF num sprite sheet
- 1
Escolha o sentido
«GIF para sheet» coloca todos os frames numa grelha. «Sheet para GIF» faz o contrário: diz-lhe a grelha e a animação é remontada.
- 2
Abra o seu ficheiro
Um GIF, WebP animado, APNG ou AVIF animado num sentido; um sheet em PNG, WebP ou JPG no outro.
- 3
Monte a grelha
Deixe as colunas em zero para uma grelha quase quadrada, ou defina-as. Acrescente separação entre células se o seu motor precisar, e reduza o tamanho dos frames se o sheet ficasse demasiado grande.
- 4
Descarregue
Com os metadados activados, leva o PNG e o JSON num ZIP, porque o JSON refere a imagem pelo nome e separá-los quebra a ligação.
O que a distingue
As durações sobrevivem
Um sprite sheet nu perde precisamente o que o fazia uma animação: quanto dura cada frame. O JSON leva todas as durações, por isso a animação pode ser remontada exacta, num motor ou aqui de volta.
O formato do Aseprite, não um nosso
Os metadados usam o formato que o Aseprite exporta, já lido pelo Phaser, pelo PixiJS e pelos importadores do Godot e do Unity. Inventar um nosso significaria você escrever um adaptador.
Diz-lhe o tamanho antes de montar
A área do sheet é o número de frames vezes o tamanho do frame, com qualquer grelha, por isso uma animação longa simplesmente não cabe numa só imagem. As medidas resultantes aparecem enquanto muda as opções, calculadas pelo mesmo código que o monta.
Ao cortar, a última linha incompleta não estorva
Cinco frames numa grelha de 3×2 deixam uma célula vazia. Diga quantos frames há de facto e essa célula é saltada, em vez de aparecer um frame em branco no fim da sua animação.
A separação que os motores realmente pedem
O padding entre células evita que a filtragem bilinear arraste píxeis do frame vizinho, que é a causa habitual das costuras finas em volta dos sprites. A margem em volta do sheet também está lá.
Formatos aceites
Para sheet: GIF animado, WebP animado, APNG e AVIF animado. Sai um sheet em PNG, transparente a não ser que escolha um fundo, mais o JSON opcional. No outro sentido entra qualquer sheet em PNG, WebP ou JPG e sai um GIF animado.
Perguntas frequentes
- Para que serve um sprite sheet?
- Os motores de jogo desenham as animações a partir de uma única textura em vez de um ficheiro por frame: um só envio para a GPU e uma só imagem a gerir. É a forma padrão de entregar animação 2D no Godot, no Unity, no Phaser e nos restantes.
- Preciso do JSON?
- Se o seu motor lê o JSON do Aseprite, sim: poupa-lhe escrever à mão os rectângulos e os tempos. Se vai colocar o sheet numa grelha uniforme e definir a velocidade no código, o PNG basta.
- Porque não posso fazer o sheet numa só linha longa?
- Pode, fixando as colunas ao número de frames, mas raramente ajuda: a área é a mesma e as texturas muito largas batem nos limites das GPU antigas. Uma grelha quase quadrada é a opção segura.
- Porque diz que o sheet ficaria demasiado grande?
- Porque a área é frames × largura × altura, e nenhuma grelha muda isso. Uma animação de 200 frames a 400×400 são 32 megapíxeis numa só imagem. Reduza o tamanho dos frames, ou encurte a animação primeiro.
- Os frames cortados saem desviados um píxel. O que aconteceu?
- A grelha não divide o sheet de forma exacta. A ferramenta recusa uma grelha que precisasse de píxeis fraccionários em vez de a arredondar, porque o erro cresce a cada coluna; reveja os números, ou descreva a grelha por tamanho de frame.
- Posso obter os frames como ficheiros separados?
- Sim, mas a partir do divisor de GIF: abra lá a animação e exporte os frames como PNG dentro de um ZIP.