`
beike
  • 浏览: 362803 次
社区版块
存档分类
最新评论

JPEG格式 标准 规范 二进制

阅读更多
 JPEG格式

 

微处理机中的存放顺序有正序(big endian)和逆序(little endian)之分。正序存放就是高字节存放在前低字节在后,而逆序存放就是低字节在前高字节在后。例如,十六进制数为A02B,正序存放就是A02B,逆序存放就是2BA0。摩托罗拉(Motorola)公司的微处理器使用正序存放,而英特尔(Intel)公司的微处理器使用逆序。JPEG文件中的字节是按照正序排列的。

 


JPEG委员会在制定JPEG标准时,定义了许多标记(marker)用来区分和识别图像数据及其相关信息,但笔者没有找到JPEG委员会对JPEG文件交换格式的明确定义。直到1998年12月从分析网上具体的JPG图像来看,使用比较广泛的还是JPEG文件交换格式(JPEG File Interchange Format,JFIF)本号为1.02。这是1992年9月由在C-Cube Microsystems公司工作的Eric Hamilton提出的。此外还有TIFF JPEG等格式,但由于这种格式比较复杂,因此大多数应用程序都支持JFIF文件交换格式。

 

JPEG文件使用的颜色空间是CCIR 601推荐标准进行的彩色空间(参看第7章)。在这个彩色空间中,每个分量、每个像素的电平规定为255级,用8位代码表示。从RGB转换成YCbCr空间时,使用下面的精确的转换关系:

       Y = 256 * E'y

      Cb = 256 * [E'Cb] + 128

      Cr = 256 * [E'Cr] + 128
其中亮度电平E'y和色差电平E'Cb和E'Cb分别是CCIR 601定义的参数。由于E'y的范围是0~1,E'Cb和E'Cb的范围是-0.5~+0.5,因此Y, Cb和Cr的最大值必须要箝到255。于是RGB和YCbCr之间的转换关系需要按照下面的方法计算。

(1) 从RGB转换成YCbCr

YCbCr(256级)分量可直接从用8位表示的RGB分量计算得到:

       Y =   0.299 R + 0.587 G  + 0.114 B

     Cb = - 0.1687R - 0.3313G  + 0.5   B + 128

    Cr = 0.5 R - 0.4187G - 0.0813 B + 128

需要注意的是不是所有图像文件格式都按照R0,G0,B0,…… Rn,Gn,Bn的次序存储样本数据,因此在RGB文件转换成JFIF文件时需要首先验证RGB的次序。

(2) 从YCbCr转换成RGB

RGB分量可直接从YCbCr(256级)分量计算得到:

     R = Y                 + 1.402 (Cr-128)

      G = Y - 0.34414 (Cb-128) - 0.71414 (Cr-128)

      B = Y + 1.772 (Cb-128)

在JFIF文件格式中,图像样本的存放顺序是从左到右和从上到下。这就是说JFIF文件中的第一个图像样本是图像左上角的样本。

6.3.2 文件结构

JFIF文件格式直接使用JPEG标准为应用程序定义的许多标记,因此 JFIF格式成了事实上JPEG文件交换格式标准。JPEG的每个标记都是由2个字节组成,其前一个字节是固定值0xFF。每个标记之前还可以添加数目不限的0xFF填充字节(fill byte)。下面是其中的8个标记:

  1. SOI  0xD8            图像开始
  2. APP0 0xE0            JFIF应用数据块
  3. APPn 0xE1 - 0xEF    其他的应用数据块(n, 1~15)
  4. DQT  0xDB           量化表
  5. SOF0 0xC0            帧开始
  6. DHT  0xC4           霍夫曼(Huffman)表
  7. SOS  0xDA           扫描线开始
  8. EOI  0xD9            图像结束

为使读者对JPEG定义的标记一目了然,现将JPEG的标记码列于表6-05,并保留英文解释。

表6-05 JPEG定义的标记

 

Symbol

(符号)

Code Assignment

(标记代码)

Description

(说明)

Start Of Frame markers, non-hierarchical Huffman coding

SOF0

0xFFC0

Baseline DCT

SOF1

0xFFC1

Extended sequential DCT

SOF2

0xFFC2

Progressive DCT

SOF3

0xFFC3

Spatial (sequential) lossless

Start Of Frame markers, hierarchical Huffman coding

SOF5

0xFFC5

Differential sequential DCT

SOF6

0xFFC6

Differential progressive DCT

SOF7

0xFFC7

Differential spatial lossless

Start Of Frame markers, non-hierarchical arithmetic coding

JPG

0xFFC8

Reserved for JPEG extensions

SOF9

0xFFC9

Extended sequential DCT

SOF10

0xFFCA

Progressive DCT

SOF11

0xFFCB

Spatial (sequential) Lossless

Start Of Frame markers, hierarchical arithmetic coding

SOF13

0xFFCD

Differential sequential DCT

SOF14

0xFFCE

Differential progressive DCT

SOF15

0xFFCF

Differential spatial Lossless

Huffman table specification

DHT

0xFFC4

Define Huffman table(s)

arithmetic coding conditioning specification

DAC

0xFFCC

Define arithmetic conditioning table

Restart interval termination

RSTm

0xFFD0~0xFFD7

Restart with modulo 8 counter m

Other marker

SOI

0xFFD8

Start of image

EOI

0xFFD9

End of image

SOS

0xFFDA

Start of scan

DQT

0xFFDB

Define quantization table(s)

DNL

0xFFDC

Define number of lines

DRI

0xFFDD

Define restart interval

DHP

0xFFDE

Define hierarchical progression

EXP

0xFFDF

Expand reference image(s)

APPn

0xFFE0~0xFFEF

Reserved for application use

JPGn

0xFFF0~0xFFFD

Reserved for JPEG extension

COM

0xFFFE

Comment

Reserved markers

TEM

0xFF01

For temporary use in arithmetic coding

RES

0xFF02~0xFFBF

Reserved

 

 

JPEG文件由下面的8个部分组成:

(1) 图像开始SOI(Start of Image)标记

(2) APP0标记(Marker)

① APP0长度(length)

② 标识符(identifier)

③ 版本号(version)

④ X和Y的密度单位(units=0:无单位;units=1:点数/英寸;units=2:点数/厘米)

⑤ X方向像素密度(X density)

⑥ Y方向像素密度(Y density)

⑦ 缩略图水平像素数目(thumbnail horizontal pixels)

⑧ 缩略图垂直像素数目(thumbnail vertical pixels)

⑨ 缩略图RGB位图(thumbnail RGB bitmap)

(3) APPn标记(Markers),其中n=1~15(任选)

① APPn长度(length)

② 由于详细信息(application specific information)

(4) 一个或者多个量化表DQT(difine quantization table)

① 量化表长度(quantization table length)

② 量化表数目(quantization table number)

③ 量化表(quantization table)

(5) 帧图像开始SOF0(Start of Frame)

① 帧开始长度(start of frame length)

② 精度(precision),每个颜色分量每个像素的位数(bits per pixel per color component)

③ 图像高度(image height)

④ 图像宽度(image width)

⑤ 颜色分量数(number of color components)

⑥ 对每个颜色分量(for each component)

  •  
    • ID
    • 垂直方向的样本因子(vertical sample factor)
    • 水平方向的样本因子(horizontal sample factor)
    • 量化表号(quantization table#)

(6) 一个或者多个霍夫曼表DHT(Difine Huffman Table)

① 霍夫曼表的长度(Huffman table length)

② 类型、AC或者DC(Type, AC or DC)

③ 索引(Index)

④ 位表(bits table)

⑤ 值表(value table)

(7) 扫描开始SOS(Start of Scan)

① 扫描开始长度(start of scan length)

② 颜色分量数(number of color components)

③ 每个颜色分量

  •  
    • ID
    • 交流系数表号(AC table #)
    • 直流系数表号(DC table #)

④ 压缩图像数据(compressed image data)

(8) 图像结束EOI(End of Image)

表6-06表示了APP0域的详细结构。有兴趣的读者可通过UltraEdit或者PC TOOLS等工具软件打开一个JPG图像文件,对APP0的结构进行分析和验证。

表6-06 JFIF格式中APP0域的详细结构

 

偏移

长度

内容

块的名称

说明

0

2 byte

0xFFD8

(Start of Image,SOI)

图像开始

2

2 byte

0xFFE0

APP0(JFIF application segment)

JFIF应用数据块

4

2 bytes

 

length of APP0 block

APP0块的长度

6

5 bytes

 

"JFIF"+"0"

识别APP0标记

11

1 byte

 

<Major version>

主要版本号(如版本1.02中的1)

12

1 byte

 

<Minor version>

次要版本号(如版本1.02中的02)

13

1 byte

 

<Units for the X
and Y densities>

X和Y的密度单位

units=0:无单位

units=1:点数/英寸

units=2:点数/厘米

14

2 bytes

 

<Xdensity>

水平方向像素密度

16

2 bytes

 

<Ydensity>

垂直方向像素密度

18

1 byte

 

<Xthumbnail>

缩略图水平像素数目

19

1 byte

 

<Ythumbnail>

缩略图垂直像素数目

 

3n

 

< Thumbnail RGB bitmap>

缩略RGB位图(n为缩略图的像素数)

     

Optional JFIF extension APP0 marker segment(s)

任选的JFIF扩展APP0标记段

 

……

 

……

 
 

2 byte

0xFFD9

(EOI) end-of-file

图像文件结束标记

 

 

 

评论

相关推荐

    16进制转JPG图片工具

    16进制转JPG图片工具的工作原理就是将这些16进制数据解码回原始的二进制格式,然后根据JPEG的编码标准重新构建出图像。 JPEG(Joint Photographic Experts Group)是一种有损压缩的图像格式,广泛用于网络和存储。...

    官方公布的JPEG标准

    官方公布的JPEG标准是基于ITU-T T.81文档,这正是压缩包中的“itu-t81.pdf”文件,它详细阐述了JPEG的压缩算法和技术规范。 JPEG标准的核心在于离散余弦变换(DCT)和量化,这两部分构成了其有损压缩的基础。离散...

    读取文件的2进制数据

    - 图像文件:JPEG、PNG等图像文件以二进制格式存储像素颜色信息,包括图像宽度、高度、颜色深度等元数据。 - 音频文件:MP3、WAV等音频文件以二进制编码表示声音波形,包含采样率、位深度等信息。 - 其他文件:...

    HexToJPG互转

    这个过程完成后,将得到的二进制数据按照JPEG文件格式的规范进行解析和重组,包括图像宽度、高度、颜色空间等信息。最后,这些信息被组合成一个有效的JPEG文件,可以被图像查看器识别和显示。 相反,将JPEG图片转换...

    Big small end conversion(大端小端相互转化,将文本的十六进制数据,以二进制形式保存到点jpg文件中)

    5. 如果目标是创建.jpg文件,还需要遵循JPEG文件格式的规范,包括图像的头部信息和编码标准,以确保文件能够被图像处理软件识别和打开。 在"big_small"这个压缩包文件中,很可能包含了实现上述转换功能的源代码。...

    jpeg转bmp格式

    1. **读取JPEG文件**:使用`JPEG.H`中的函数,读取JPEG文件的二进制数据,解析其文件头以获取宽度、高度、色彩空间等信息。 2. **解码JPEG数据**:JPEG数据是经过JPEG压缩算法压缩的,需要通过库函数(如`jpeg_...

    JPEG解码VC源码

    总之,JPEG解码是图像处理领域的一个核心部分,而"JPEG解码VC源码"提供了一种在VC环境下高效解码JPEG图像的方法,这对于开发者来说是宝贵的资源,可以帮助他们理解JPEG标准,优化图像处理性能,或者在自己的项目中...

    jpeg编码解码源代码

    标题中的“jpeg编码解码源代码”指的是提供了JPEG标准实现的原始程序代码,可以对图像进行编码(压缩)和解码(解压)。这些源代码遵循一定的编程规范,并且能在不同的操作系统环境下运行,例如Windows(通过Visual ...

    JPEG2000压缩、解压MATLAB代码

    6. 数据编码:编码后的系数会被转换成二进制码流,可以使用算术编码或者游程编码。MATLAB可能需要自定义编码函数来完成这个步骤。 7. 解压缩:解压过程是压缩过程的逆操作,包括解码、逆熵编码、逆小波变换和后处理...

    JPEG编码器(初学者).rar

    总的来说,学习和实现JPEG编码器不仅有助于理解图像压缩原理,还能提升C++编程技巧,特别是处理二进制流和优化算法的能力。这个项目对于计算机图形学、图像处理以及软件开发的初学者来说是一个有价值的实践。

    PDF格式规范文档ISO32000(2008)

    此外,它还定义了各种编码方式,如ASCII85、LZW、Flate和JPEG等,以支持不同类型的二进制数据压缩。该文档还包含对PDF的安全特性的描述,如加密和权限管理,确保文档的隐私和安全。 adobe_supplement_iso32000.pdf...

    Jpeg.rar_jpeg VC_jpeg压缩_visual c

    解码过程同样可以在Visual C++中实现,通过解析JPEG文件的二进制流,按照JPEG文件格式的规范,恢复出原始的8x8系数,再经过上述逆操作,得到重构的图像。 总的来说,JPEG压缩技术在图像处理中扮演着重要角色,结合...

    JPEG C++代码

    编写JPEG编码器或解码器的C++代码需要对JPEG标准有深入理解,并且需要熟悉位操作、矩阵运算以及编码算法。以下是一些关键C++编程概念: 1. **文件I/O**:处理JPEG文件时,你需要使用C++的`fstream`库来读取和写入二...

    wlt格式图片转换成jpg格式的delphi源码

    Delphi的标准库不直接提供JPEG编码,但可以通过第三方库如Indy(包含BMP to JPEG的示例)或Jpeg单元(部分Delphi版本自带)来实现。 6. **编码参数设置**: JPG是有损压缩,允许调整压缩级别以平衡图像质量和文件...

    易语言取JPG宽高

    JPG是一种基于JPEG标准的有损压缩图像格式,通常包含图像的宽度、高度、颜色空间等元数据。在易语言中,我们可以使用“读文件”命令来打开JPG文件,并使用“二进制文件操作”系列命令来解析文件内容,获取这些元数据...

    和DICOM有关的资料

    此外,“二进制转换”是编程中的基础概念,因为DICOM文件是以二进制格式存储的,理解二进制数据如何表示和转换是处理DICOM数据的关键步骤。 在压缩包内的“DICOM标准”文件,很可能是DICOM官方的标准文档或者相关的...

    JPEG编解码的c语言实现

    在C语言中实现JPEG编解码,需要理解二进制文件的读写,位操作,以及数据结构如队列和哈夫曼树。同时,需要编写处理DCT和量化运算的数学函数,以及解析JPEG文件头部信息的代码。 实际编程时,可以参考开源库如...

    libjpeg压缩bmp为jpg与将jpg解压缩为bmp

    1. BMP文件读取:BMP文件的格式相对简单,我们可以使用标准C库中的文件操作函数来读取其二进制数据。关键在于理解BMP文件头结构,包括BITMAPFILEHEADER和BITMAPINFOHEADER,从中获取图像的宽度、高度、位深度等信息...

    e语言-易语言读取DWG预览图

    5. 图像解码:将解析后的二进制数据解码成像素数组,这个过程可能涉及不同的图像编码标准,如JPEG或PNG。 6. 显示图像:最后,将解码后的图像数据转换成易语言支持的图像对象,显示在界面上。 这个源码示例对于学习...

    易语言从字节集取图片尺寸源码

    图片的字节集通常包含了图片的编码信息,如JPEG、PNG、BMP等格式的二进制表示。 提取图片尺寸的过程涉及到解析图片的文件头信息。不同的图片格式,其文件头结构也不同,但通常都包含图片的宽度和高度信息。例如,...

Global site tag (gtag.js) - Google Analytics