Explicación detallada del formato JPEG.

Los archivos JPEG utilizan una variedad de métodos de almacenamiento de datos. El formato más utilizado se llama formato de intercambio de archivos JPEG (JFIF). Los archivos JPEG generalmente se pueden dividir en dos partes: etiquetas y datos comprimidos.

El código de marca consta de dos bytes, el primer byte es un valor fijo 0xFF y el último byte tiene diferentes valores según diferentes significados. Se puede agregar un número ilimitado de relleno 0xFF sin sentido antes de cada código de marca, es decir, varios 0xFF consecutivos pueden entenderse como un 0xFF y representar el comienzo de un código de marca. Después de un código de marca completo de dos bytes, hay un flujo de datos comprimidos correspondiente al código de marca, que registra diversa información sobre el archivo.

Las etiquetas más utilizadas son SOI , APP0 , DQT , SOF0 , DHT , DRI , SOS y EOI .

Tenga en cuenta que SOI, etc. son todos nombres de etiquetas. En el archivo, el código de marcado aparece como código de marcado. Por ejemplo, el código de marca de SOI es 0xFFD8, es decir, si los datos 0xFFD8 aparecen en un archivo JPEG, significa que hay una marca SOI aquí.

código de etiqueta

Número de bytes

ilustrar

ASIQUE

0xFFD8 (valor fijo)

2 bytes

Inicio de imagen, inicio de imagen

APLICACIÓN0

0xFFE0 (valor fijo)

2 bytes

Solicitud, solicitud reservada marca 0

Contiene 9 campos específicos:

  ① Longitud de datos 2 bytes ①~⑨La longitud total de los 9 campos    no incluye el código de etiqueta, pero incluye este campo  

  ② Identificador de 5 bytes de valor fijo 0x4A46494600, que es la cadena "JFIF0"

  ③ Número de versión 2 bytes, generalmente 0x0102, que indica el número de versión JFIF 1.2,  puede haber otros valores que representen otras versiones                             

  ④ Unidad de densidad de X e Y 1 byte. Sólo hay tres valores disponibles    : 0: sin unidad; 1: puntos/pulgada; 2: puntos/cm

  ⑤ Densidad de píxeles en dirección X 2 bytes, rango de valores desconocido

  ⑥ Densidad de píxeles en dirección Y 2 bytes, rango de valores desconocido   

  ⑦ El número de píxeles horizontales en la miniatura 1 byte El rango de valores es desconocido

  ⑧ El número de píxeles verticales en la miniatura 1 byte El rango de valores es desconocido

  ⑨ La longitud del mapa de bits RGB en miniatura puede ser múltiplo de 3, datos del mapa de bits RGB en miniatura

Este segmento de etiqueta puede contener una versión en miniatura de la imagen, almacenada como píxeles RGB de 24 bits. Si no hay una imagen en miniatura (que es más común), los valores del campo ⑦ "Número de píxeles horizontales en miniatura" y del campo ⑧ "Número de píxeles verticales en miniatura" son ambos 0.

APLICAR

0xFFE1~0xFFF (valor fijo)

2 bytes

Aplicación, la aplicación conserva la marca n, donde n = 1 ~ 15 (opcional)

Contiene 2 campos específicos:

  ① Longitud de datos 2 bytes ①~②La longitud total de los 2 campos , es decir, sin incluir el código de etiqueta, pero incluyendo este campo

  ② Información detallada Longitud de los datos: 2 bytes El contenido es incierto          

Por ejemplo, la imagen JPEG generada por Adobe Photoshop utiliza dos segmentos de marca APP1 y APP13 para almacenar una copia de la imagen respectivamente.

DQT

0xFFD8 (valor fijo)

2 bytes

Definir tabla de cuantificación, definir tabla de cuantificación

 Contiene 9 campos específicos:

  ① Longitud de datos 2 bytes La longitud total del campo ① y varios campos ②, es decir, sin incluir el código de etiqueta, pero incluido este campo

  ② Longitud de los datos de la tabla de cuantificación: 2 bytes

      (a) ID de tabla de precisión y cuantificación 1 byte, alto 4 bits: precisión, solo dos valores opcionales  0: 8 bits; 1: 16 bits

                                                                     4 bits bajos: ID de la tabla de cuantificación, el rango de valores es 0~3

      (b) Entrada de tabla (64 × (precisión + 1)) bytes, por ejemplo, una tabla de cuantificación de precisión de 8 bits, la longitud de la entrada  es 64 × (0 + 1) = 64 bytes

En esta sección de etiquetas, el campo ② puede aparecer repetidamente para representar múltiples tablas de cuantificación, pero solo puede aparecer hasta 4 veces.

SOF0

0xFFC0 (valor fijo)

2 bytes

Inicio del cuadro, inicio de la imagen del cuadro (basado en transformación de coseno discreto)

Contiene 9 campos específicos:

  ① Longitud de datos 2 bytes ①~⑥La longitud total de los seis campos, es decir, sin incluir el código de etiqueta, pero incluido este campo

  ② Precisión: 1 byte. El número de dígitos por muestra de datos suele ser de 8 bits. Generalmente, el software no admite 12 bits ni 16 bits.

  ③ Altura de la imagen 2 bytes Altura de la imagen (unidad: píxel), si no se admite DNL, ​​debe ser> 0

  ④ Ancho de imagen 2 bytes Ancho de imagen (unidad: píxel), si no se admite DNL, ​​debe ser> 0

  ⑤ 颜色分量数                  1字节     只有3个数值可选,1:灰度图;3:YCrCb或YIQ;4:CMYK,而JFIF中使用YCrCb,故这里颜色分量数恒为3

  ⑥颜色分量信息               颜色分量数×3字节(通常为9字节)

     (a)颜色分量ID               1字节    

     (b)水平/垂直采样因子   1字节             高4位:水平采样因子,低4位:垂直采样因子(曾经看到某资料把这两者调转了)

     (c)量化表                      1字节            当前分量使用的量化表的ID

本标记段中,字段⑥应该重复出现,有多少个颜色分量(字段⑤),就出现多少次(一般为3次)。

DHT

0xFFC4(固定值)

2字节

Difine Huffman Table,定义哈夫曼表

包含2个具体字段:

 ①数据长度                                2字节            字段①和多个字段②的总长度,即不包括标记代码,但包括本字段

 ② 哈夫曼表                              数据长度-2字节

(a)表ID和表类型                        1字节            高4位:类型,只有两个值可选  0:DC直流;1:AC交流,低4位:哈夫曼表ID,

                                                                           注意,DC表和AC表分开编码

(b)不同位数的码字数量              16字节

(c)编码内容                               16个不同位数的码字数量之和(字节)

本标记段中,字段②可以重复出现(一般4次),也可以致出现1次。例如,Adobe Photoshop 生成的JPEG图片文件中只有1个DHT标记段,里边包含了4个哈夫曼表;而Macromedia Fireworks生成的JPEG图片文件则有4个DHT标记段,每个DHT标记段只有一个哈夫曼表。

DRI

0xFFDD

2字节

Define Restart Interval,定义差分编码累计复位的间隔

包含2个具体字段:

 ①数据长度                                         2字节      固定值0x0004,①~②两个字段的总长度,即不包括标记代码,但包括本字段

 ②MCU块的单元中的重新开始间隔      2字节      设其值为n,则表示每n个MCU块就有一个

                                                                                     RSTn标记。第一个标记是RST0,第二个是

                                                                                     RST1等,RST7后再从RST0重复。

如果没有本标记段,或间隔值为0时,就表示不存在重开始间隔和标记RST

SOS

0xFFDA(固定值)

2字节

Start of Scan,扫描开始

 包含2个具体字段:

  ①数据长度                             2字节       ①~④两个字段的总长度,即不包括标记代码,但包括本字段

  ②颜色分量数                          1字节       应该和SOF中的字段⑤的值相同,即:1:灰度图是;3: YCrCb或YIQ;4:CMYK。

                                                                  而JFIF中使用YCrCb,故这里颜色分量数恒为3

  ③颜色分量信息

      (a) 颜色分量ID                    1字节

      (b) 直流/交流系数表号        1字节       高4位:直流分量使用的哈夫曼树编号,低4位:交流分量使用的哈夫曼树编号

  ④ 压缩图像数据

       (a)谱选择开始                    1字节      固定值0x00

       (b)谱选择结束                    1字节      固定值0x3F

       (c)谱选择                           1字节     在基本JPEG中总为00

本标记段中,字段③应该重复出现,有多少个颜色分量(字段②),就出现多少次(一般为3次)。本段结束后,紧接着就是真正的图像信息了。图像信息直至遇到一个标记代码就自动结束,一般就是以EOI标记表示结束。

EOI

0xFFD9

2字节

End of Image,图像结束

如果在图像数据流中遇到0xFF,应该检测其紧接着的字符,如果是

1)0x00,则表示0xFF是图像流的组成部分,需要进行译码;

2)0xD9,则与0xFF组成标记EOI,则图像流结束,同时图像文件结束;

3)0xD0~0xD7,则组成RSTn标记,则要忽视整个RSTn标记,即不对当前0xFF和紧接的0xDn两个字节进行译码,并按RST标记的规则调整译码变量;

3)0xFF,则忽视当前0xFF,对后一个0xFF再作判断;

4) Para otros valores, se ignora el 0xFF actual y se conserva el siguiente valor para la decodificación.

Supongo que te gusta

Origin blog.csdn.net/u010192735/article/details/120867340
Recomendado
Clasificación