Pular para o conteúdo

Como transformar uma imagem em BlurHash e em um LQIP JPEG

A bancada lê uma imagem local com o decodificador do próprio navegador, desenha-a em um canvas de no máximo 160 px no lado maior e codifica esses pixels duas vezes: como string BlurHash e como URL de dados de um JPEG pequeno. Os dois são placeholders da mesma imagem e nenhum sai da aba.

A prévia da esquerda é o hash decodificado de novo no formato do original, e a da direita é o JPEG recém-gerado, então os dois quadros mostram o que a visita vê enquanto a imagem real carrega. A linha abaixo informa o tamanho de origem, o comprimento da string e o peso do JPEG.

  1. Selecione uma imagem local. Serve qualquer formato que o navegador decodifique — JPEG, PNG, WebP — e um arquivo animado é lido como o primeiro quadro; o GIF de teste de 120 × 60 gerou um placeholder vermelho a partir dele. A linha de status confirma o nome quando a imagem está pronta.
  2. Ajuste os dois componentes do BlurHash, X para colunas e Y para linhas, de 1 a 9 cada, 4 × 3 por padrão. Mais componentes guardam mais detalhe e aumentam a string; um valor fora da faixa volta para 9 ou 1, e um campo vazio retorna ao padrão.
  3. Ajuste a largura do LQIP, de 8 a 96 px, 32 por padrão. É a largura em pixels do JPEG, não um tamanho de exibição: a altura segue a proporção do original e o arquivo fica na casa dos kilobytes em qualquer largura permitida.
  4. Clique em Gerar placeholders. O hash decodificado e o JPEG aparecem lado a lado, a linha de dados mostra os números e uma imagem transparente é achatada sobre branco nas duas saídas.
  5. Leve o resultado com Copiar BlurHash, Copiar URL LQIP ou Baixar LQIP — o arquivo é salvo como voritools-lqip.jpg. Limpar esvazia o seletor e as duas saídas e devolve os campos para 4 × 3 e 32.

O que contêm a string, o JPEG e as duas prévias

O que a string BlurHash contém

Um BlurHash é uma codificação de texto curta de uma versão desfocada da imagem. Os primeiros caracteres carregam a grade de componentes e um máximo quantizado; depois vêm a cor média e um coeficiente por célula. Com a grade 4 × 3 padrão a string mediu 28 caracteres; um único componente 1 × 1 gerou 6 caracteres e uma cor plana, e o máximo de 9 × 9 chegou a 166 caracteres e preserva mais estrutura.

A string é feita para um decodificador BlurHash na sua própria página: as bibliotecas de referência em JavaScript, PHP, Swift ou Kotlin, o componente de React ou uma CDN de imagem que aceite um hash. Ela não carrega largura, altura nem metadados: o decodificador desenha no tamanho que você pedir. Esta página codifica e também decodifica o próprio hash para a prévia, mas não aceita um hash como entrada.

O JPEG LQIP e sua URL de dados

A segunda saída é um JPEG de verdade, escrito na largura escolhida e com compressão fixa (qualidade 0,58). Na amostra de 800 × 500 usada nos testes, os 32 px padrão geraram uma URL de dados de 987 bytes — 1 KB na linha de dados — e 96 px ficaram abaixo de 1,6 KB. A linha de dados imprime o número exato da sua imagem.

Como é uma URL de dados, pode ser colada direto no src de um img, em um background-image do CSS ou em um picture, sem uma segunda requisição. O JPEG não tem canal alfa, então as áreas transparentes são pintadas de branco — o mesmo achatamento usado no hash — e o arquivo mantém a proporção do original. Baixar salva como voritools-lqip.jpg.

Processamento local, precisão e limites

A imagem é lida, desenhada e codificada na página. Nada do arquivo é enviado, não há conta nem etapa de upload, e a ferramenta continua funcionando sem conexão depois que a página carrega. O resultado também é reproduzível: a mesma imagem com os mesmos componentes e a mesma largura gera sempre a mesma string e o mesmo JPEG.

O codificador implementa o algoritmo de referência do BlurHash; os hashes gerados aqui foram comparados com a implementação de referência e batem, então outro decodificador desenha o mesmo placeholder. Os únicos limites reais são os do navegador: uma foto muito grande não é problema porque a codificação amostra em 160 px, mas a aba precisa decodificar o arquivo antes, e um formato que o navegador não lê precisa ser convertido antes de usar aqui.

Ferramentas recentes: