Como converter Base64 para WebP
- Cole o Base64 ou o URI completo
data:image/webp;base64,.... Código que contenha um deles, como umurl()de CSS ou uma tag<img>, também funciona. - Confira se a linha de status mostra Detectado WebP, depois veja a prévia e as dimensões acima dela. WebP animado roda na prévia.
- Clique em Baixar arquivo. A extensão já vem como
webp.
Os três tipos de WebP
WebP é um contêiner RIFF com um de três tipos de chunk logo depois da tag WEBP. Como a tag fica em um offset fixo, o tipo também aparece em uma posição fixa do Base64:
| O Base64 começa com | Chunk | O que é |
|---|---|---|
UklGR…XRUJQVlA4I | VP8 | com perdas, sem transparência |
UklGR…XRUJQVlA4T | VP8L | sem perdas, pode ter transparência |
UklGR…XRUJQVlA4W | VP8X | estendido: com perdas e canal alfa, animação, perfil ICC ou EXIF |
Os seis caracteres entre UklGR e XRUJQ codificam o tamanho do arquivo e mudam de um arquivo para outro. XRUJQ (de WEBP) sempre ocupa os caracteres 12 a 16, e VlA4 (de VP8), os caracteres 17 a 20. O 21º caractere é o que interessa: I, T ou W.
O tipo decide o que acontece quando você converte o arquivo. WebP sem perdas substitui bem um PNG. WebP com perdas já perdeu detalhes, então convertê-lo para PNG gera um arquivo grande sem recuperar a qualidade. Um arquivo estendido pode ter vários quadros; ao convertê-lo para um formato estático, só o primeiro fica.
Como verificar o tipo de WebP no código
O mesmo teste em Python lê a tag do chunk e, nos arquivos estendidos, o byte de flags:
import base64
def webp_kind(b64: str) -> str:
data = base64.b64decode(b64.split(",", 1)[-1])
if data[:4] != b"RIFF" or data[8:12] != b"WEBP":
return "not WebP"
chunk = data[12:16]
if chunk == b"VP8 ":
return "lossy"
if chunk == b"VP8L":
return "lossless"
flags = data[20]
parts = ["extended"]
if flags & 0x10:
parts.append("alpha")
if flags & 0x02:
parts.append("animated")
return ", ".join(parts)
Para arquivos WebP gravados pelo Pillow, a função devolve lossy, lossless, extended, alpha para uma imagem com perdas e transparência, e extended, animated para uma animação. Mais em Base64 em Python.
RIFF nem sempre é WebP
UklGR significa apenas “RIFF”. Áudio WAV e vídeo AVI começam do mesmo jeito e se diferenciam pela tag nos bytes 8 a 11. O decodificador verifica essa tag, então um WAV colado aqui aparece como “Isto parece ser WAV, não WebP”, com um botão para salvá-lo como .wav. O Base64 para áudio toca o arquivo.
Onde aparece Base64 de WebP
- Exportações de canvas com
toDataURL("image/webp", quality). Confira o resultado: navegadores sem codificador WebP devolvem PNG sem avisar. - APIs de imagem e CDNs que entregam WebP a qualquer cliente que o aceite. Se a imagem foi buscada por um navegador, até um campo chamado
thumbnail_jpgpode conter WebP. - Placeholders e ícones inline em HTML e CSS, onde o WebP gera uma string mais curta que PNG ou JPEG.
- Figurinhas de chat, que muitas vezes são WebP, às vezes animadas.
Quando um programa antigo recusa o arquivo salvo, compare o SHA-256 mostrado aqui com o do arquivo que ele recebeu. Se forem iguais, o programa não lê WebP, e a saída é uma cópia em PNG ou JPEG.
Perguntas frequentes
Meu WebP em Base64 é com perdas ou sem perdas?
Olhe o 21º caractere da string. I depois de VlA4 indica uma imagem VP8 com perdas, T uma imagem VP8L sem perdas, e W o formato estendido, usado por imagens com perdas que têm transparência ou por animações.
Dá para salvar o WebP decodificado como PNG ou JPG?
Não apenas renomeando; os bytes continuam sendo WebP. Baixe o .webp, depois use WebP para Base64 com Converter para PNG ou JPEG e decodifique a nova string em Base64 para PNG.
Por que canvas.toDataURL('image/webp') me devolveu um PNG?
Navegadores que não conseguem codificar WebP, o Safari em especial, devolvem em silêncio um data URI PNG. Cole o resultado aqui: se aparecer PNG, foi isso que aconteceu.
Por que a prévia falha em um Mac ou iPhone mais antigo?
O Safari 14 e 15 só exibem WebP no macOS 11 Big Sur ou posterior, e o Safari anterior ao 14 não exibe. Nesses casos a prévia diz que o navegador não consegue exibir a imagem, mas Baixar arquivo ainda salva um .webp válido.