Técnicas de compactação

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

No Google, estamos sempre procurando maneiras de agilizar o carregamento de páginas da Web. Uma maneira de fazer isso é reduzindo o tamanho das imagens da Web. As imagens compõem até 60% a 65% de bytes na maioria das páginas da Web, e o tamanho da página é um fator importante no tempo total de renderização. O tamanho da página é especialmente importante para dispositivos móveis, em que imagens menores economizam largura de banda e duração da bateria.

WebP é um novo formato de imagem desenvolvido pelo Google e compatível com Chrome, Opera e Android otimizado para permitir imagens menores e mais rápidas na Web. As imagens WebP têm tamanho 30% menor em comparação com imagens PNG e JPEG a uma qualidade visual equivalente. Além disso, o formato de imagem WebP é compatível com outros formatos. Ela aceita estas opções:

  • Compactação com perda:a compactação com perdas é baseada na codificação do frame-chave VP8. VP8 é um formato de compactação de vídeo criado pela On2 Technologies como um sucessor dos formatos VP6 e VP7.

  • Compactação sem perda:o formato de compactação sem perda é desenvolvido pela equipe WebP.

  • Transparência: o canal Alfa de 8 bits é útil para imagens gráficas. O canal alfa pode ser usado com RGB com perda, um recurso que não está disponível no momento com nenhum outro formato.

  • Animação:oferece suporte a imagens animadas em cores verdadeiras.

  • Metadados:pode ter metadados EXIF e XMP (usados por câmeras, por exemplo, por exemplo).

  • Perfil de cor:pode ter um perfil ICC incorporado.

Devido à melhor compactação de imagens e à compatibilidade com todos esses recursos, o WebP pode ser uma excelente substituição para a maioria dos formatos de imagem: PNG, JPEG ou GIF. Melhor ainda, você sabia que o WebP oferece novas oportunidades de otimização de imagens, como compatibilidade com imagens com perda da transparência? Sim. WebP é o canivete suíço de formatos de imagem.

Então, como essa mágica é feita? Vamos pegar as mangas e dar uma olhada nos bastidores.

WebP com perdas

A compactação com perdas do WebP usa a mesma metodologia que o VP8 para prever frames (vídeo). O VP8 é baseado na previsão de bloqueio e, como qualquer codec baseado em bloco, o VP8 divide o frame em segmentos menores chamados de macroblocks.

Em cada macrobloco, o codificador pode prever informações de movimento e cor redundantes com base nos blocos processados anteriormente. O frame da imagem é "quot;key"" no sentido de que ele usa apenas os pixels já decodificados na vizinhança espacial imediata de cada um dos macroblocks e tenta pintar a parte desconhecida deles. Isso é chamado de programação preditiva. Consulte codificação intraframe do vídeo VP8.

Os dados redundantes podem ser subtraídos do bloco, o que resulta em uma compactação mais eficiente. Só existe uma pequena diferença, chamada residual, para transmissão em um formato compactado.

Depois de sujeitos a uma transformação matemática de inversão (o DCT famoso, que significa Discrete Cosine Transform), os residuais normalmente contêm muitos valores de zero, que podem ser compactados de forma muito mais eficaz. O resultado é, em seguida, quantizado e codificado por entropia. De maneira divertida, a etapa de quantização é a única em que os bits são descartados com perdas. Pesquise a divisão por QPj no diagrama abaixo. Todas as outras etapas são invertíveis e sem perda.

O diagrama a seguir mostra as etapas envolvidas na compactação com perda do WebP. Os recursos diferenciados em comparação com o JPEG estão circulados em vermelho.

O WebP usa a quantização de blocos e distribui bits de forma adaptável em diferentes segmentos de imagem: menos bits para segmentos de baixa entropia e mais altos para segmentos de entropia maiores. O WebP usa a codificação de entropia aritmética, gerando uma compactação melhor em comparação com a codificação Huffman usada em JPEG.

VP8 Modos de previsão interna

Os modos de intraprevisão VP8 são usados com três tipos de macroblocks:

  • Lâmpada 4x4
  • luma de 16 x 16
  • Chroma 8 x 8

Quatro modos comuns de dentro da previsão são compartilhados por estes macroblocks:

  • H_PRED (previsão horizontal). Preenche cada coluna do bloco com uma cópia da coluna à esquerda, L.

  • V_PRED (previsão vertical). Preenche cada linha do bloco com uma cópia da linha acima, A.

  • DC_PRED (previsão DC). Preenche o bloco com um único valor usando a média dos pixels na linha acima de A e a coluna à esquerda de L.

  • TM_PRED (previsão do MotionMotion). Um modo que consegue o nome de uma técnica de compactação desenvolvida pela On2 Technologies. Além da linha A e da coluna L, o TM_PRED usa o pixel P acima e à esquerda do bloco. As diferenças horizontais entre os pixels em A (a partir de P) são propagadas usando os pixels de L para iniciar cada linha.

O diagrama abaixo ilustra os diferentes modos de previsão usados na compactação com perda de WebP.

Para blocos de luma 4x4, há seis modos intra semelhantes a V_PRED e H_PRED, mas isso corresponde à previsão de pixels em direções diferentes. Veja mais detalhes sobre esses modos no Guia de stream de VP8.

Quantização de bloco adaptável

Para melhorar a qualidade de uma imagem, ela é segmentada em áreas com características visivelmente semelhantes. Para cada um desses segmentos, os parâmetros de compactação (etapas de quantização, força do filtro etc.) são ajustados de maneira independente. Isso proporciona uma compactação eficiente ao redistribuir os bits para onde eles são mais úteis. O VP8 permite no máximo quatro segmentos, uma limitação da bitstream de VP8.

Por que o WebP (com perdas) é melhor que o JPEG

A codificação de previsão é uma das principais razões pelas quais o WebP vence em JPEG. A quantização adaptativa de blocos também faz uma grande diferença. A filtragem ajuda em taxas de bits médias/baixas. A codificação aritmética booleana fornece ganhos de compactação de 5% a 10% em comparação com a codificação Huffman.

WebP sem perda

A codificação sem perda do WebP é baseada na transformação da imagem com várias técnicas diferentes. Em seguida, a programação de entropia é realizada nos parâmetros de transformação e nos dados de imagens transformados. As transformações aplicadas à imagem incluem previsão espacial de pixels, transformação de espaço de cores, usando paletas emergentes localmente, empacotamento de vários pixels em um pixel e substituição Alfa. Para a codificação de entropia, usamos uma variante da codificação LZ77-Huffman, que usa a codificação 2D de valores de distância e valores esparsos compactos.

Transformação do preditor (espacial)

A previsão espacial é usada para reduzir a entropia ao explorar o fato de que pixels vizinhos costumam ser correlacionados. Na transformação do preditor, o valor atual do pixel é previsto com base nos pixels que já estão decodificados (em ordem de linha de verificação), e apenas o valor residual (real, previsto) está codificado. O modo de previsão determina o tipo de previsão a ser usado. A imagem é dividida em várias regiões quadradas e todos os pixels em um quadrado usam o mesmo modo de previsão.

Há 13 modos de previsão diferentes. As opções predominantes são pixels esquerdo, superior, superior esquerdo e superior direito. As restantes são combinações (médias) de esquerda, superior, esquerda e superior direita.

Transformação de cor (descorrelação)

O objetivo da transformação de cor é decorar os valores de R, G e B de cada pixel. A transformação de cor mantém o valor verde (G) como está, transforma vermelho (R) com base em verde e transforma azul (B) com base em verde e depois com base em vermelho.

Como acontece com a transformação do preditor, primeiro a imagem é dividida em blocos, e o mesmo modo de transformação é usado para todos os pixels em um bloco. Para cada bloco, há três tipos de elementos de transformação de cores: green_to_red, green_to_blue e red_to_blue.

Subtrair transformação verde

A "transformação verde subtraída" subtrai os valores verdes dos valores vermelhos e azuis de cada pixel. Quando essa transformação está presente, o decodificador precisa adicionar o valor verde para vermelho e azul. Esse é um caso especial da transformação de descorrelação de cor geral acima, frequente o suficiente para justificar um corte.

Transformação de indexação de cores (paletas)

Se não houver muitos valores de pixel exclusivos, pode ser mais eficiente criar uma matriz de índice de cores e substituir os valores de pixel pelos índices da matriz. A transformação de indexação de cores faz isso. A transformação de indexação de cores verifica o número de valores únicos de ARGB na imagem. Se esse número estiver abaixo do limite (256), ele criará uma matriz desses valores de ARGB, que será usada para substituir os valores de pixel pelo índice correspondente.

Codificação de cache de cores

A compactação de WebP sem perda usa fragmentos de imagem já vistos para reconstruir novos pixels. Ele também pode usar uma paleta local se nenhuma correspondência interessante for encontrada. Esta paleta é atualizada continuamente para reutilizar cores recentes. Na imagem abaixo, é possível ver o cache de cores local em ação sendo atualizado progressivamente com as 32 cores usadas recentemente à medida que a verificação diminui.

Referência do LZ77 para trás

Referências anteriores são tuplas de códigos de comprimento e distância. Comprimento indica quantos pixels na ordem da linha de verificação serão copiados. O código de distância é um número que indica a posição de um pixel visto anteriormente de onde os pixels serão copiados. Os valores de comprimento e distância são armazenados usando a codificação de prefixo LZ77.

A codificação de prefixo LZ77 divide grandes valores inteiros em duas partes: o código prefixo e os bits extras. O código de prefixo é armazenado usando um código de entropia, enquanto os bits extras são armazenados como estão (sem um código de entropia).

O diagrama abaixo ilustra a LZ77 (variante 2D) com correspondência de palavra, em vez de pixels.

WebP com perda com Alfa

Além do WebP com perda (cores RGB) e do WebP sem perda (RGB sem perda com alfa), há outro modo WebP que permite a codificação com perda para canais RGB e a codificação sem perdas para o canal Alfa. Esse tipo de possibilidade (RGB com perda e alfa sem perdas) não está disponível hoje com nenhum dos formatos atuais de imagem. Atualmente, os webmasters que precisam de transparência precisam codificar imagens sem perdas em PNG, o que gera um tamanho significativo. O WebP Alfa codifica imagens com poucos bits por pixel e oferece uma maneira eficaz de reduzir o tamanho dessas imagens. A compactação sem perdas do canal Alfa adiciona apenas 22% bytes em codificação WebP com perda (qualidade 90).

No geral, a substituição do PNG transparente por WebP com perda + alfa oferece, em média, 60 a 70% de economia de tamanho. Isso foi confirmado como um ótimo recurso de atrair sites para dispositivos móveis com vários ícones, (por exemplo, everything.me).