Formato de intercâmbio de arquivos JPEG - JPEG File Interchange Format

O JPEG File Interchange Format ( JFIF ) é um padrão de formato de arquivo de imagem . Ele define especificações suplementares para o formato do contêiner que contém os dados da imagem codificados com o algoritmo JPEG . As especificações básicas para um formato de contêiner JPEG são definidas no Anexo B do padrão JPEG, conhecido como JPEG Interchange Format (JIF). JFIF se baseia em JIF para resolver algumas das limitações de JIF, incluindo complexidade desnecessária, registro de amostra de componente, resolução, proporção de aspecto e espaço de cor . Como JFIF é um padrão suplementar, o formato de arquivo resultante pode ser referido como "JPEG / JFIF".

JFIF é mutuamente incompatível com o formato de arquivo de imagem Exchangeable mais recente (Exif).

Propósito

JFIF define uma série de detalhes que não são especificados pelo padrão JPEG Parte 1 ( ISO / IEC 10918-1, Recomendação ITU-T T.81.)

Registro de amostra de componente

JPEG permite que vários componentes (como Y, Cb e Cr ) tenham resoluções diferentes, mas não define como essas matrizes de amostra diferentes devem ser alinhadas. O padrão JFIF requer que as amostras sejam localizadas " intersticialmente " - o que significa que o decodificador pode tratar cada matriz de componente como representando uma matriz de pixels retangulares de tamanhos iguais amostrados em seus centros, com cada matriz tendo os mesmos limites externos da imagem. Isso é conveniente para usuários de computador, mas não é o alinhamento usado no MPEG-2 e na maioria dos aplicativos de vídeo.

Resolução e proporção da imagem

O padrão JPEG não inclui nenhum método de codificação da resolução ou proporção de uma imagem. JFIF fornece informações de resolução ou proporção de aspecto usando uma extensão de segmento de aplicativo para JPEG. Ele usa o segmento de aplicativo # 0, com um cabeçalho de segmento que consiste na string terminada em nulo com a grafia "JFIF" em ASCII seguida por um byte igual a 0, e especifica que este deve ser o primeiro segmento no arquivo, tornando-o simples para reconhecer um arquivo JFIF. As imagens Exif gravadas por câmeras digitais geralmente não incluem este segmento, mas normalmente estão em conformidade com o padrão JFIF em todos os outros aspectos.

Espaço colorido

O padrão JPEG usado para a codificação de compactação em arquivos JFIF não define qual codificação de cor deve ser usada para imagens. JFIF define o modelo de cor a ser usado: Y para tons de cinza ou YCbCr derivado de cores primárias RGB, conforme definido em CCIR 601 (agora conhecido como Rec. ITU-R BT.601), exceto com uma escala de "faixa completa" diferente de os componentes Y, Cb e Cr. Ao contrário da "faixa de estúdio" definida no CCIR 601, em que o preto é representado por Y = 16 e branco por Y = 235 e os valores fora desta faixa estão disponíveis para processamento de sinal "headroom" e "footroom", JFIF usa todos os 256 níveis da representação de 8 bits, de modo que Y = 0 para preto e Y = 255 para branco máximo. As cores primárias RGB definidas em JFIF via CCIR 601 também diferem um pouco do que se tornou prática comum em aplicativos mais recentes (por exemplo, elas diferem ligeiramente das cores primárias definidas em sRGB ). Além disso, o CCIR 601 (antes de 2007) não forneceu uma definição precisa das cores primárias RGB; em vez disso, baseou-se nas práticas subjacentes da indústria da televisão.

A interpretação de cores de uma imagem JFIF pode ser melhorada incorporando um perfil ICC , metadados de espaço de cores ou uma marca sRGB e usando um aplicativo que interpreta essas informações.

Estrutura de formato de arquivo

Um arquivo JFIF consiste em uma sequência de marcadores ou segmentos de marcadores (para obter detalhes, consulte JPEG, Sintaxe e estrutura ). Os marcadores são definidos na parte 1 do padrão JPEG . Cada marcador consiste em dois bytes: um FFbyte seguido por um byte que não é igual a 00ou FFe especifica o tipo do marcador. Alguns marcadores são independentes, mas a maioria indica o início de um segmento de marcador que contém bytes de dados de acordo com o seguinte padrão:

FF xx s1 s2 [data bytes]

Os bytes s1 e s2 são considerados juntos para representar um inteiro big-endian de 16 bits que especifica o comprimento dos seguintes "bytes de dados" mais os 2 bytes usados ​​para representar o comprimento. Em outras palavras, s1 e s2 especificam o número dos bytes de dados a seguir como .

De acordo com a parte 1 do padrão JPEG, os aplicativos podem usar segmentos de marcadores de APP e definir um significado específico dos dados para o aplicativo. No padrão JFIF, os seguintes segmentos do marcador APP são definidos:

  • Segmento de marcador JFIF APP0 (segmento JFIF abreviado) (obrigatório)
  • Segmento de marcador APP0 de extensão JFIF (segmento JFXX abreviado) (opcional)

Eles são descritos a seguir.

O padrão JFIF requer que o segmento do marcador JFIF APP0 siga imediatamente o marcador SOI. Se um segmento de marcador APP0 de extensão JFIF for usado, ele deve seguir imediatamente o segmento de marcador JFIF APP0. Portanto, um arquivo JFIF terá a seguinte estrutura:

Estrutura de arquivo JFIF
Segmento Código Descrição
ENTÃO EU FF D8 Início da imagem
JFIF-APP0 FF E0 s1 s2 4A 46 49 46 00 ... Veja abaixo
JFXX-APP0 FF E0 s1 s2 4A 46 58 58 00 ... opcional, veja abaixo
... segmentos de marcadores adicionais
(por exemplo SOF, DHT, COM)
SOS FF DA Início da varredura
dados de imagem compactados
EOI FF D9 Fim da Imagem

Segmento de marcador JFIF APP0

No segmento de marcador JFIF APP0 obrigatório, os parâmetros da imagem são especificados. Opcionalmente, uma miniatura não compactada pode ser incorporada.

Segmento de marcador JFIF APP0
Campo Tamanho (bytes) Descrição
Marcador APP0 2 FF E0
Comprimento 2 Comprimento do segmento excluindo o marcador APP0
Identificador 5 4A 46 49 46 00= "JFIF" em ASCII , terminado por um byte nulo
Versão JFIF 2 Primeiro byte para a versão principal, segundo byte para a versão secundária ( 01 02para 1.02)
Unidades de densidade 1 Unidades para os seguintes campos de densidade de pixels
  • 00 : Sem unidades; largura: altura proporção de aspecto de pixel = Ydensity: Xdensity
  • 01 : Pixels por polegada (2,54 cm)
  • 02 : Pixels por centímetro
Xdensity 2 Densidade horizontal de pixels. Não deve ser zero
Ydensity 2 Densidade de pixels vertical. Não deve ser zero
Xthumbnail 1 Contagem de pixels horizontal da seguinte miniatura RGB incorporada. Pode ser zero
Ythumbnail 1 Contagem de pixels verticais da seguinte miniatura RGB incorporada. Pode ser zero
Dados de miniatura 3 × n Dados de miniatura raster de RGB de 24 bits não compactados (8 bits por canal de cor) na ordem R0, G0, B0, ... Rn-1, Gn-1, Bn-1; com n = Xthumbnail × Ythumbnail

Segmento de marcador APP0 de extensão JFIF

Imediatamente após o segmento de marcador JFIF APP0 pode haver um segmento de marcador de extensão JFIF APP0. Este segmento pode estar presente apenas para JFIF versões 1.02 e superiores. Permite inserir uma imagem em miniatura em 3 formatos diferentes.

Segmento de marcador APP0 de extensão JFIF
Campo Tamanho (bytes) Descrição
Marcador APP0 2 FF E0
Comprimento 2 Comprimento do segmento excluindo o marcador APP0
Identificador 5 4A 46 58 58 00= "JFXX" em ASCII , terminado por um byte nulo
Formato de miniatura 1 Especifica qual formato de dados é usado para a seguinte miniatura incorporada:
  • 10 : Formato JPEG
  • 11 : 1 byte por pixel paletizado formato
  • 13 : Formato RGB de 3 bytes por pixel
Dados de miniatura variável Depende do formato da miniatura, veja abaixo

Os dados da miniatura dependem do formato da miniatura da seguinte forma:

Miniatura armazenada usando codificação JPEG
Campo Tamanho (bytes) Descrição
ENTÃO EU 2 FF D8
variável Deve ser o formato JIF usando YCbCr ou apenas Y e não deve conter segmentos JFIF ou JFXX
EOI 2 FF D9
Miniatura armazenada usando um byte por pixel
Campo Tamanho (bytes) Descrição
Xthumbnail 1 Contagem de pixels horizontal da seguinte miniatura incorporada. Não deve ser zero
Ythumbnail 1 Contagem de pixels verticais da seguinte miniatura incorporada. Não deve ser zero
Paleta de miniaturas 768 256 entradas de paleta, cada uma contendo um valor de cor RGB de 24 bits
Dados de miniatura n Um byte por pixel contendo o índice da cor na paleta,

com n = Xthumbnail × Ythumbnail

Miniatura armazenada usando três bytes por pixel
Campo Tamanho (bytes) Descrição
Xthumbnail 1 Contagem de pixels horizontal da seguinte miniatura incorporada. Não deve ser zero
Ythumbnail 1 Contagem de pixels verticais da seguinte miniatura incorporada. Não deve ser zero
Dados de miniatura 3 × n Dados de miniatura raster de RGB de 24 bits não compactados (8 bits por canal de cor) na ordem R0, G0, B0, ... Rn-1, Gn-1, Bn-1; com n = Xthumbnail × Ythumbnail

Compatibilidade

O formato de arquivo de imagem Exchangeable mais recente (Exif) é comparável ao JFIF, mas os dois padrões são mutuamente incompatíveis. Isso ocorre porque ambos os padrões especificam que seu segmento de aplicativo específico (APP0 para JFIF, APP1 para Exif) deve seguir imediatamente o marcador SOI. Na prática, muitos programas e câmeras digitais produzem arquivos com os dois segmentos de aplicativo incluídos. Isso não afetará a decodificação da imagem para a maioria dos decodificadores, mas os analisadores JFIF ou Exif mal projetados podem não reconhecer o arquivo corretamente.

O JFIF é compatível com as extensões JPEG "Information Resource Block" do Adobe Photoshop e metadados do modelo de intercâmbio de informações IPTC , já que o JFIF não impede outros segmentos de aplicativo e as extensões do Photoshop não precisam ser as primeiras no arquivo. No entanto, o Photoshop geralmente salva buffers CMYK como "Adobe JPEGs" de quatro componentes que não estão em conformidade com JFIF. Como esses arquivos não estão em um espaço de cores YCbCr, eles normalmente não podem ser decodificados por navegadores da Web e outros softwares de Internet.

História

O desenvolvimento do documento JFIF foi liderado por Eric Hamilton da C-Cube Microsystems , e o acordo sobre a primeira versão foi estabelecido no final de 1991 em uma reunião realizada na C-Cube envolvendo cerca de 40 representantes de várias empresas de computador, telecomunicações e imagem. Pouco depois, uma pequena revisão foi publicada - JFIF 1.01. Por quase 20 anos, a última versão disponível foi a v1.02, publicada em 1º de setembro de 1992.

Em 1996, a RFC 2046 especificava que o formato de imagem usado para transmitir imagens JPEG pela Internet deveria ser JFIF. O tipo MIME de "imagem / jpeg" deve ser codificado como JFIF. Na prática, entretanto, praticamente todos os softwares de Internet podem decodificar qualquer imagem JIF de linha de base que use componentes Y ou YCbCr, seja ela compatível com JFIF ou não.

Com o passar do tempo, o C-Cube foi reestruturado (e eventualmente devolvido para Harmonic , LSI Logic , Magnum Semiconductor , Avago Technologies , Broadcom e GigOptix, GigPeak, etc) e perdeu o interesse no documento, e a especificação não tinha editor oficial até ser escolhido pela Ecma International e pelo Grupo de Especialistas Fotográficos Conjuntos ITU-T / ISO / IEC por volta de 2009 para evitar que se perdesse na história e fornecer uma maneira de citá-lo formalmente em publicações padrão e melhorar sua qualidade editorial. Foi publicado pela ECMA em 2009 como Relatório Técnico número 98 para evitar a perda do registro histórico, e foi formalmente padronizado pela ITU-T em 2011 como sua Recomendação T.871 e pela ISO / IEC em 2013 como ISO / IEC 10918- 5, As publicações mais recentes incluíram melhorias editoriais, mas nenhuma mudança técnica substancial.

Veja também

Referências

Leitura adicional

Livros

Padrões