Layout de texto para meme
O gerador de layout de texto para meme transforma a largura e a altura de uma imagem, junto com duas legendas, em instruções práticas de desenho.
Executar grátis
Ele seleciona um único tamanho de fonte legível, quebra cada legenda em linhas e retorna caixas delimitadoras em pixels próximas às bordas superior e inferior. O cálculo é determinístico, portanto a mesma entrada sempre produz as mesmas coordenadas. Use o resultado com Canvas, SVG, uma biblioteca de imagens ou um serviço de renderização para manter a tipografia consistente sem ajustar tamanhos por tentativa e erro.
Informe a tela e as duas legendas
Digite a largura e a altura da imagem em pixels e, em seguida, o texto que deve aparecer na parte superior e na parte inferior. As duas legendas são obrigatórias, pois este layout equilibra um meme completo com duas áreas de texto. Os espaços no início e no fim são removidos, e espaços repetidos dentro da legenda são normalizados antes da medição. Assim, uma legenda vazia gera um erro de entrada em vez de uma caixa enganosa sem tamanho. As dimensões devem ser números inteiros entre 64 e 10,000 pixels, e cada legenda pode ter até 500 caracteres. Esses limites tornam o cálculo previsível tanto na página interativa quanto em um fluxo automatizado. A margem depende do menor lado da imagem, mantendo um afastamento visual semelhante em formatos retrato, paisagem e quadrado. Se a imagem for redimensionada, faça o cálculo com as dimensões finais para preservar as quebras e o alinhamento.
Entenda o ajuste e a quebra de linhas
A calculadora escolhe um tamanho de fonte inteiro compartilhado pelas duas legendas. Ela começa com um valor derivado das dimensões da imagem e testa tamanhos progressivamente menores até que os blocos superior e inferior caibam. Cada legenda pode ocupar até quarenta e dois por cento da altura útil, deixando separação mesmo quando ambas precisam de várias linhas. As palavras permanecem inteiras sempre que possível. Quando uma palavra é mais larga que a área disponível, ela é dividida em partes para que a caixa nunca ultrapasse a imagem. As estimativas usam um perfil interno estável para letras grossas e condensadas: caracteres estreitos ocupam menos espaço, enquanto maiúsculas largas ocupam mais. É uma estimativa analítica, não uma medição de fonte feita pelo navegador. Para obter a correspondência mais próxima, use uma fonte condensada em negrito semelhante à Impact, aplique a altura de linha retornada e centralize todas as linhas.
Renderize a geometria em pixels
O resultado inclui o tamanho de fonte selecionado, a altura de linha, a margem externa e objetos separados para as áreas superior e inferior. Cada objeto contém suas linhas, além das coordenadas x e y, largura e altura em pixels. A caixa superior começa na margem calculada. A caixa inferior termina à mesma distância da borda de baixo, mantendo sua posição estável independentemente do número de linhas. Desenhe as linhas a partir da coordenada y da caixa, avançando pela altura de linha, e centralize cada uma em relação à imagem inteira. Se a API gráfica posicionar texto pela linha de base, adicione antes a ascendente da fonte escolhida. Espessura do contorno, sombra, uso de maiúsculas e cor ficam fora desta capacidade: alteram a aparência, mas não a geometria reservada. Em automações, salve os valores com as legendas para reproduzir a composição sem repetir testes manuais de tamanho.
Casos de uso
Criar um gerador de memes
Calcule uma geometria consistente antes de desenhar texto sobre os modelos de imagem escolhidos por seus usuários.
Preparar comandos de Canvas ou SVG
Converta duas legendas em linhas e caixas de pixels que um renderizador de interface possa consumir diretamente.
Automatizar imagens para redes sociais
Crie layouts repetíveis para lotes de imagens legendadas sem testar manualmente uma sequência de tamanhos.
Perguntas frequentes
Quanto custa o cálculo?
Cada solicitação à API custa US$ 0,002. O mesmo cálculo determinístico também pode ser executado no navegador.
Por que as duas legendas precisam ter texto?
Esta capacidade calcula um layout equilibrado com duas legendas. Um texto superior ou inferior vazio, ou formado apenas por espaços, é rejeitado como entrada inválida.
O resultado modifica minha imagem?
Não. Ele retorna somente dados de fonte e geometria. Use esses valores com o renderizador de imagem, Canvas ou SVG de sua preferência.
Qual fonte devo usar na renderização?
Uma fonte condensada em negrito com métricas semelhantes às da Impact é a opção que mais se aproxima das estimativas internas.
Uma palavra longa pode ultrapassar a imagem?
Não. Se uma palavra exceder a área útil, ela será dividida para que todas as caixas permaneçam dentro das margens horizontais.
Por que as legendas usam o mesmo tamanho?
O tamanho compartilhado dá peso visual consistente ao meme. O menor tamanho exigido por qualquer uma das legendas é aplicado às duas.
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
curl -X POST https://api.kit.forhosting.com/image/meme-text-layout \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"width":1200,"height":800,"top_caption":"WHEN THE TESTS PASS","bottom_caption":"ON THE FIRST TRY"}'const res = await fetch("https://api.kit.forhosting.com/image/meme-text-layout", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"width": 1200,
"height": 800,
"top_caption": "WHEN THE TESTS PASS",
"bottom_caption": "ON THE FIRST TRY"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/image/meme-text-layout",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"width": 1200,
"height": 800,
"top_caption": "WHEN THE TESTS PASS",
"bottom_caption": "ON THE FIRST TRY"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/image/meme-text-layout", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"width":1200,"height":800,"top_caption":"WHEN THE TESTS PASS","bottom_caption":"ON THE FIRST TRY"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"width":1200,"height":800,"top_caption":"WHEN THE TESTS PASS","bottom_caption":"ON THE FIRST TRY"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/image/meme-text-layout", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemplo de requisição
{
"width": 1200,
"height": 800,
"top_caption": "WHEN THE TESTS PASS",
"bottom_caption": "ON THE FIRST TRY"
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "image.meme_text_layout",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Limites
max_width | 10000 |
max_height | 10000 |
max_chars | 500 |
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |