Ir para o conteúdo
AZ Tools

Inspetor de estrutura JPEG

Percorre um JPEG como um decodificador faz, marcador a marcador do SOI ao EOI, e informa o que é cada segmento, onde começa e quantos bytes ocupa. O cabeçalho de quadro (SOFn) dá as dimensões, a precisão de amostra, o número de componentes e os fatores de amostragem, e o número desse marcador é também o que decide se o arquivo é baseline ou progressivo: o navegador desenha um baseline linha a linha e um progressivo como uma imagem inteira que vai ficando nítida, uma diferença de exibição que nenhum pixel revela. Os fatores de amostragem viram a notação conhecida 4:4:4, 4:2:2 ou 4:2:0 e aparecem também em bruto, de modo que uma foto sem definição pode ser atribuída à cor guardada em metade da resolução e não ao ajuste de qualidade. As tabelas de quantização são comparadas com as tabelas de exemplo do anexo K da norma: quando são essas tabelas escaladas pelo libjpeg, a qualidade exata que as gerou é recuperada; quando não são, o número é uma média e vem rotulado como estimativa, porque MozJPEG, Photoshop e quase todos os firmwares de câmera escalam de outro jeito ou trazem tabelas próprias. Os segmentos de aplicação aparecem com seus tamanhos, que costuma ser onde mora a surpresa: um perfil ICC dividido em vários pedaços APP2, um bloco EXIF carregando uma miniatura, um pacote XMP de um editor ou um bloco de recursos do Photoshop, tudo contado em bytes e como proporção do arquivo. Do EXIF são informados apenas a presença e o tamanho; as tags se leem no visualizador EXIF deste site. A seção de codificação acrescenta o intervalo de reinício, quantas tabelas Huffman existem, quantas varreduras o arquivo tem e qual parte são dados com codificação entrópica, que é o único trecho que uma recompressão consegue encolher. Por fim, diz se o arquivo termina mesmo no EOI e quantos bytes vêm depois, algo invisível para qualquer decodificador e o jeito clássico de transformar um JPEG em um poliglota. O que ele não faz é decodificar pixels nem julgar qualidade visual, e um arquivo cortado dentro da varredura é recusado em vez de lido pela metade, porque depois do corte nada do que fosse relatado seria confiável.

Como usar

  1. Solte um .jpg na caixa ou clique para escolher. Nada é enviado: os bytes são lidos na própria página.
  2. Comece pela visão geral: dimensões, baseline ou progressivo, subamostragem de croma e qualidade estimada.
  3. Olhe a tabela de segmentos de aplicação quando o arquivo estiver grande demais; em imagens pequenas um perfil ICC ou uma miniatura EXIF pesam mais que a foto.
  4. Abra as tabelas de quantização para ver as matrizes reais e se são as do anexo K ou as próprias do codificador.
  5. Percorra a lista de marcadores atrás de esquisitices: cabeçalho JFIF ausente, um APPn estranho ou bytes depois do EOI.

Perguntas frequentes

Baseline ou progressivo? Como a ferramenta sabe e por que isso importa?
Vem de um único byte. Um arquivo baseline tem cabeçalho de quadro SOF0 e um progressivo tem SOF2, e a ferramenta relata o marcador que encontrou em vez de adivinhar olhando a imagem. Importa pelo modo como a foto aparece enquanto carrega: um JPEG baseline é decodificado em uma varredura de cima para baixo, então se preenche linha a linha, enquanto um progressivo guarda várias varreduras que refinam o quadro inteiro, de forma que uma versão borrada surge depois dos primeiros quilobytes. Progressivos costumam ser alguns por cento menores porque seus coeficientes se agrupam de maneira mais compressível, mas custam mais CPU e memória para decodificar, e por isso muitos fluxos mantêm baseline para imagens muito pequenas e miniaturas.
Por que a qualidade é apenas uma estimativa?
Arquivos JPEG não guardam um número de qualidade. Guardam tabelas de quantização, e o controle de qualidade de um codificador é só uma regra para gerá-las. O libjpeg pega as tabelas de exemplo do anexo K e escala cada coeficiente por um único fator derivado desse controle, então essa escala pode ser invertida: quando as tabelas batem exatamente com uma tabela do anexo K escalada, a ferramenta avisa e o número recuperado é o valor que de fato foi passado ao libjpeg. Photoshop, MozJPEG, Guetzli e a maioria dos firmwares de câmera usam tabelas ou escalas próprias, e aí o máximo possível é uma média, por isso o valor é rotulado como estimativa. Salvar de novo também quebra o vínculo: um arquivo codificado a 90 e recodificado a 95 tem as tabelas de 95 e o detalhe de 90.
Minha foto parece sem nitidez mesmo em qualidade alta. O que devo olhar?
A subamostragem de croma, que é uma decisão separada da qualidade. Em 4:2:0 os dois canais de cor ficam guardados com metade da largura e metade da altura, então uma linha vermelha sobre fundo azul, um texto colorido ou a borda de um logotipo saturado são reconstruídos a partir de um quarto das amostras de cor e saem borrados por mais alta que seja a qualidade. A ferramenta deduz isso dos fatores de amostragem do cabeçalho de quadro e mostra os números crus ao lado da notação: luminância 2×2 com croma 1×1 é 4:2:0, luminância 2×1 é 4:2:2 e tudo 1×1 é 4:4:4. A maioria dos codificadores muda para 4:4:4 automaticamente por volta da qualidade 90, e é por isso que uma exportação a 95 pode parecer mais nítida do que a diferença de quantização explicaria.
O arquivo está muito maior do que a imagem merece. Para onde foram os bytes?
Veja o total dos segmentos de aplicação. Um perfil ICC é o suspeito de sempre: um perfil v4 completo chega a dezenas de quilobytes e, como um segmento JPEG só comporta 65.533 bytes, ele é dividido em vários pedaços APP2 que a ferramenta conta para você. Blocos EXIF costumam levar uma miniatura embutida, pacotes XMP de programas de edição podem ser vários quilobytes de XML e o bloco APP13 do Photoshop guarda demarcadores e fatias que você nunca vai usar na web. O número dos dados entrópicos conta a outra metade da história: se a varredura é só 40% do arquivo, recomprimir a imagem não adianta, mas remover metadados adianta.
O que é um intervalo de reinício e por que eu iria querer um?
Um segmento DRI define o intervalo de reinício, e o codificador passa a escrever um marcador RST a cada N MCUs, zerando ali o estado do codificador entrópico. Isso custa um pouco de tamanho e dá duas coisas: um decodificador consegue se ressincronizar depois de um byte corrompido em vez de perder o resto da imagem, e pode decodificar em paralelo os blocos entre reinícios. A maioria dos JPEGs da web não tem intervalo nenhum; eles aparecem em saídas de scanner e de transmissão, e em arquivos feitos para decodificadores em hardware. Quando existe, esta ferramenta informa o intervalo em MCUs, e os próprios marcadores RST são pulados como parte da varredura em vez de listados como segmentos.
Por que a ferramenta recusa um arquivo que meu visualizador abre normalmente?
Porque um visualizador pode ser tolerante e um relatório de estrutura não pode. Se o arquivo termina sem marcador EOI, ele foi cortado dentro dos dados comprimidos, e um decodificador mostrará as linhas que conseguiu ler — mas a cadeia de marcadores não tem fim, então qualquer total impresso aqui seria o total de um fragmento. O mesmo vale quando um segmento declara um comprimento que passa do fim do arquivo: tudo depois daquele ponto é ilegível, e relatar os segmentos anteriores como se o arquivo estivesse inteiro seria pior do que não dizer nada. Os dois casos são erros com nome aqui, assim como um arquivo que sequer começa com o marcador SOI, cuja causa comum é um PNG renomeado para .jpg.

Ferramentas relacionadas