`

JPG文件格式解码图片高度和宽度的分析

阅读更多
13. 简单说一下 JPG 文件的解码
-------------------------
解码程序先从 JPG 文件中读出采样系数, 这样就知道了 MCU 的大小, 算出整个图象
有几个 MCU. 解码程序再循环逐个对 MCU 解码, 一直到检查到 EOI 标记. 对于每个
MCU, 按正规的次序解出每个 DU, 然后组合, 转换成 (R,G,B) 就 OK 了

附:JPEG 文件格式
~~~~~~~~~~~~~~~~

  - 文件头 (2 bytes):  $ff, $d8 (SOI) (JPEG 文件标识)
  - 任意数量的段 , 见后面
  - 文件结束 (2 bytes): $ff, $d9 (EOI)

段的格式:
~~~~~~~~~

  - header (4 bytes):
       $ff     段标识
        n      段的类型 (1 byte)
       sh, sl  该段长度, 包括这两个字节, 但是不包括前面的 $ff 和 n.
               注意: 长度不是 intel 次序, 而是 Motorola 的, 高字节在前,
      低字节在后!
  - 该段的内容, 最多 65533 字节

 注意:
  - 有一些无参数的段 (下面那些前面注明星号的)
    这些段没有长度描述 (而且没有内容), 只有 $ff 和类型字节.
  - 段之间无论有多少 $ff 都是合法的, 必须被忽略掉.

段的类型:
~~~~~~~~~

   *TEM   = $01   可以忽略掉

    SOF0  = $c0   帧开始 (baseline JPEG), 细节附后
    SOF1  = $c1   dito
    SOF2  = $c2   通常不支持
    SOF3  = $c3   通常不支持

    SOF5  = $c5   通常不支持
    SOF6  = $c6   通常不支持
    SOF7  = $c7   通常不支持

    SOF9  = $c9   arithmetic 编码(Huffman 的一种扩展算法), 通常不支持
    SOF10 = $ca   通常不支持
    SOF11 = $cb   通常不支持

    SOF13 = $cd   通常不支持
    SOF14 = $ce   通常不支持
    SOF14 = $ce   通常不支持
    SOF15 = $cf   通常不支持

    DHT   = $c4   定义 Huffman Table,  细节附后
    JPG   = $c8   未定义/保留 (引起解码错误)
    DAC   = $cc   定义 Arithmetic Table, 通常不支持

   *RST0  = $d0   RSTn 用于 resync, 通常被忽略
   *RST1  = $d1
   *RST2  = $d2
   *RST3  = $d3
   *RST4  = $d4
   *RST5  = $d5
   *RST6  = $d6
   *RST7  = $d7

    SOI   = $d8   图片开始
    EOI   = $d9   图片结束
    SOS   = $da   扫描行开始, 细节附后
    DQT   = $db   定义 Quantization Table, 细节附后
    DNL   = $dc   通常不支持, 忽略
    DRI   = $dd   定义重新开始间隔, 细节附后
    DHP   = $de   忽略 (跳过)
    EXP   = $df   忽略 (跳过)

    APP0  = $e0   JFIF APP0 segment marker (细节略)
    APP15 = $ef   忽略

    JPG0  = $f0   忽略 (跳过)
    JPG13 = $fd   忽略 (跳过)
    COM   = $fe   注释, 细节附后

 其它的段类型都保留必须跳过

SOF0: Start Of Frame 0:
~~~~~~~~~~~~~~~~~~~~~~~

  - $ff, $c0 (SOF0)
  - 长度 (高字节, 低字节), 8+components*3     这里占两个字节
  - 数据精度 (1 byte) 每个样本位数, 通常是 8 (大多数软件不支持 12 和 16)    这里占一个字节
  - 图片高度 (高字节, 低字节), 如果不支持 DNL 就必须 >0      这里占两个字节
  - 图片宽度 (高字节, 低字节), 如果不支持 DNL 就必须 >0      这里占两个字节
  也就是说,在FFC0后3个字节开始 , 两个字节为图片高度 ,再两个字节为图片宽度
  - components 数量(1 byte), 灰度图是 1, YCbCr/YIQ 彩色图是 3, CMYK 彩色图
    是 4
  - 每个 component: 3 bytes
     - component id (1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q)
     - 采样系数 (bit 0-3 vert., 4-7 hor.)
     - quantization table 号
分享到:
评论
1 楼 陈砚羲君 2012-03-05  

相关推荐

    JPG图片文件结构分析

    在分析JPG文件时,可以通过读取和解析这些标记来理解文件的内容和结构。例如,通过检查SOF标记可以获取图像的宽度和高度,通过量化表可以了解压缩的质量,而通过图像数据可以重建图像。 在处理或操作JPG文件时,...

    jpg图片解码程序

    本程序是专门针对这种格式设计的,用于将JPEG编码的图像文件解码回其原始的像素数据。 **JPEG编码原理** JPEG编码主要基于离散余弦变换(DCT)和量化技术。首先,图像被分割成8x8的宏块,然后每个宏块进行DCT,将...

    C++获取jpg和png图像的宽和高

    总之,理解和实现C++中获取JPEG和PNG图像宽度和高度的过程,需要深入理解这两种图像格式的内部结构,同时也要注意处理各种可能的边缘情况,确保代码的稳定性和兼容性。通过使用"PictureWidthHeight"代码库,开发者...

    JPG文件解码成BMP文件

    总结来说,使用ARM处理器解码JPG文件并转换为BMP文件是一项涉及图像处理、编解码理论、文件格式和嵌入式系统优化技术的综合任务。这个过程需要理解图像压缩原理,掌握C编程和ARM架构特性,以及对BMP和JPG文件格式的...

    stm32图片解码

    首先,BMP(Bitmap)文件格式是一种常见的无损图像文件格式,它存储的是像素数据,包括颜色深度、图像宽度、高度等信息。在STM32上实现BMP图片的解码,需要理解其文件结构,读取头信息,并根据颜色位深将数据转换为...

    C语言解码JPG图片源代码

    标题 "C语言解码JPG图片源代码" 提供了一个关于使用C语言处理JPEG(Joint Photographic Experts Group)图像格式的编程主题。JPEG是一种广泛使用的有损图像压缩标准,尤其适用于照片和其他高质量图像。源代码通常...

    C++ BMP与JPG格式的图片互相转换源代码不使用其它库

    而JPG到BMP的转换则需要解码JPG文件,恢复像素数据,并按照BMP格式重新组织成文件。 由于JPG的压缩特性,转换过程中可能会引入损失,尤其是在从JPG转为BMP时,由于原始的压缩信息丢失,无法完全恢复到原始图像。...

    JPG文件头读取

    在描述中提到的软件工具,提供了这样的功能,允许用户查看并保存这些信息为TXT文件,便于进一步分析和记录。 通过这个工具,你可以检查JPG文件是否符合标准,是否存在损坏,或者查找可能的篡改痕迹。例如,如果你...

    十六进制与jpg图片之间的转换

    Jpg文件格式遵循特定的编码规则,包括一个文件头,定义了图像的宽度、高度、颜色空间等信息,接着是经过压缩的图像数据,最后可能还有一些附加的元数据。 转换工具在这一过程中扮演关键角色,它需要正确地解读和...

    JPEG格式图片解码C语言实现.zip

    在C语言中实现JPEG图片的解码是一项基础且重要的任务,对于理解和优化图像处理软件有着重要意义。本文将深入探讨JPEG解码的基本原理以及使用C语言进行实现的关键步骤。 JPEG格式采用离散余弦变换(DCT)来对图像...

    图像文件格式转换

    信息头包含了图像的宽度、高度、位深度和压缩方式等;调色板用于索引图像;数据部分按照从左到右,从下到上的顺序存储像素。 - **BITMAPFILEHEADER** 结构体包含文件类型标识(bfType)、文件大小(bfSize)、保留...

    BMP文件转换为JPG文件的源代码

    - 写入JPG文件:最后,按照JPG文件格式的规范,构建文件头和信息头,然后写入量化后的系数,形成JPG文件。 4. **VC++编程**: 在VC++中,可以使用GDI+库来处理图像,该库提供了读取BMP和写入JPG的功能。或者,...

    BMP格式文件转换为JPG格式文件 BMP转JPG格式

    6. **写入JPG文件**:最后,将编码后的数据写入JPG文件的头信息和主体部分,形成一个完整的JPG文件。 在VC++ 6.0环境下,程序可能使用标准I/O或文件流来操作文件,以及位运算和数组操作来处理图像数据。对于初学者...

    BMP.zip_BMP图片解码_BMP格式编解码_BMP解码_FAT unicode BMP_显示.bmp图片

    首先,我们来理解BMP图片格式。BMP是一种无损的位图图像格式,由微软公司开发,广泛用于Windows和OS/2操作系统。BMP文件头包含图像的宽度、高度、颜色深度等信息,而图像数据按照从左到右、从下到上的顺序存储。这种...

    jpg jpeg 解码 转 bmp RGB vs2013 c++

    在图像处理领域,JPEG、JPEG(也写作JPG)和BMP是三种常见的位图文件格式,每种格式都有其特定的应用场景和编码方式。本文将深入探讨如何使用C++在Visual Studio 2013环境下,从JPEG图像转换为BMP图像,涉及的主要...

    JPG文件转换成BMP文件

    你需要创建符合BMP规范的文件头,包括位图宽度、高度、位深度等信息。 4. **转换图像数据**:由于BMP格式通常使用RGB色彩模型,这一步通常是透明的,因为JPEG解码后已经是以RGB表示。如果需要特定的色彩深度(如24...

    16进制转JPG图片工具

    16进制转JPG图片工具是专为处理这种特定需求而设计的软件,它允许用户将从单片机或其他数据采集设备获取的16进制代码转换成我们常见的JPEG(JPG)图片格式。这种转换过程涉及到数字图像处理、二进制数据解析以及图像...

    易语言BMP图片文件头显示工具

    总的来说,这个易语言BMP图片文件头显示工具是一个实用的编程示例,它涵盖了文件读取、数据转换、位操作以及图像文件解析等多个方面,对于学习易语言和深入理解BMP文件格式的人来说,是一个非常有价值的资源。...

    ffmpeg视频生成jpg图片_1

    在本示例"ffmpeg视频生成jpg图片_1"中,我们将探讨如何利用FFmpeg从视频文件中提取静态图像并保存为JPEG(jpg)格式的图片。 首先,FFmpeg的基本命令结构是`ffmpeg -i 输入文件 -vf "滤镜表达式" -o 输出文件`。在...

Global site tag (gtag.js) - Google Analytics