Olá novamente! Encontrei este artigo, escrito em maio de 2019. Este é um continuação da série de artigos sobre WAVE e JPEG, Aqui . Esta publicação incluirá informações sobre o algoritmo de codificação de imagens e sobre o formato em si.
Uma pitada de história
Uma colherada de artigo da Wikipédia:
JPEG (Joint Photographic Experts Group) é um dos formatos gráficos rasterizados mais populares, utilizado para armazenar fotos e imagens semelhantes.
Esse padrão foi desenvolvido pelo Grupo Conjunto de Especialistas em Fotografia ainda em 1991, para compressão eficiente de imagens.
Qual é o caminho que as imagens percorrem desde a forma bruta até o JPEG
Alguns acreditam que as imagens JPEG são dados brutos comprimidos pelo método Huffman, mas não é bem assim. Antes da compressão, os dados passam por um longo caminho.
Primeiro, o modelo de cores é alterado de RGB para YCbCr. Para isso, existe até mesmo um algoritmo especial — . O Y não é tocado, pois é responsável pela luminosidade, e sua alteração será percebida.
A primeira coisa que se faz com a imagem é «subamostragem» (subsampling). É fácil de entender: pega-se uma matriz de pixels 2x2, em seguida, pegam-se Cb e Cr — os valores médios de cada um dos componentes YCbCr desses 4 pixels. Assim, ganhamos 6 bytes, ao invés de 4 Y, 4 Cb, 4 Cr, obtivemos 4 Y e iguais para cada um deles Cb e Cr (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 — 6 = 6). Em uma escala de 2×2, uma compressão com perda com uma taxa de compressão de 2:1 soa sólida. Isso se aplica a toda a imagem. Portanto, reduzimos pela metade o tamanho. E essa técnica pode ser utilizada devido à nossa percepção de cores. Um ser humano percebe facilmente a diferença de luminosidade, mas não a de cor, se ela for média em um pequeno bloco de pixels. A subamostragem também pode ser feita em linha, 4 pixels na horizontal e na vertical. O primeiro método é mais comumente utilizado. Se a qualidade da imagem for importante, a subamostragem não é feita de forma alguma.
Uma ilustração clara da subamostragem (Habr não permitiu inserir o gif) —
A parte principal da preparação
DCT
Agora a parte mais complicada e necessária. Toda a imagem é dividida em blocos de 8x8 (usa-se preenchimento caso a resolução não seja múltipla do lado do bloco).
Agora, aplica-se DCT (Transformada Discreta de Cosseno) a cada bloco.. Nesta parte, tudo o que é excessivo é removido da imagem. Usando a DCT, é necessário entender se este bloco (8×8) descreve alguma parte monótona da imagem: céu, parede; ou contém uma estrutura complexa (cabelos, símbolos, etc.). É lógico que 64 pixels semelhantes em cor podem ser descritos por apenas 1, já que o tamanho do bloco é conhecido. Aqui está a compressão: 64 para 1.
A DCT transforma o bloco em um espectro, e onde os valores mudam abruptamente, o coeficiente se torna positivo, e quanto mais brusca a transição, maior será a saída. Onde o coeficiente é mais alto, a imagem apresenta transições nítidas em cor e luminosidade; onde é mais baixo, mudanças suaves nas magnitudes dos componentes YCbCr no bloco.
Quantização
Aqui já são aplicadas as configurações de compressão. Cada um dos coeficientes em cada uma das matrizes 8×8 é dividido por um número específico. Se a qualidade da imagem após todas as suas modificações não for mais reduzida, o divisor deve ser um. Se a memória ocupada por esta foto for mais importante para você, o divisor será maior que 1, e o quociente é arredondado. Assim, depois do arredondamento, muitas vezes resultam em muitos zeros.
A quantização é feita para permitir uma compressão ainda maior. Aqui está como fica com a quantização do gráfico y = sin(x):

Compressão
Primeiro, passamos pela matriz em zigue-zague:

Obtemos um array unidimensional com números. Vemos que há muitos zeros nele, que podem ser removidos. Para isso, em vez de uma sequência de muitos zeros, escrevemos 1 zero e, depois dele, o número que indica a quantidade na sequência. Assim, pode-se reduzir até 1/3 do tamanho total do array. E então, esse array é simplesmente comprimido pelo método de Huffman e inserido no próprio arquivo.
Onde é utilizado
Em toda parte. Assim como o PNG, o JPEG é usado em câmeras, sistemas operacionais (como logotipos de empresas, ícones de aplicativos, miniaturas) e em todas as áreas onde é necessário armazenar imagens de forma eficiente.
Saída
Atualmente, o conhecimento sobre JPEG é valioso apenas para fins educacionais, pois já está embutido e otimizado em muitos lugares por grandes grupos de pessoas, mas a pedra da ciência ainda é atraente.
Fontes
Fonte: habr.com
