首页 > 编程知识 正文

JPEG文件格式,jpeg2k格式

时间:2023-05-06 10:26:56 阅读:210064 作者:2794

python中要识别图像信息用于机器学习等的话,使用opencv和numpy就可以了,简单快捷。

目录

分块

FFD8、FFD9-SOI、EOI-文件开始与结束

FFE0-APP0-图像识别信息

FFDB-DQT-定义量化表

FFC0-SOF0-图像基本信息

FFC4-DHT-定义Huffman表

FFDA-SOS-扫描行开始


以一张随手创建的简单图片为例:

它的二进制形式(开头部分)如下:

当然,这其实是十六进制。二进制指的是计算机中按二进制数进行存储,为了便于查看显示为十六进制而已。

如何查看二进制形式:

把文件的后缀名去掉,然后用Sublime或UltraEdit等打开即可。注意如果用记事本或notepad++等打开的话可能会乱码。

分块

JPEG文件内部分为若干块,这些块由ff开头(截图中已标出部分),ff后紧跟的一个标记符指明了这个块的类型。

这些分块按出现顺序分别是:

SOIff d8文件开始APP0ff e0定义交换格式和图像识别信息DQTff db定义量化表SOF0ff c0帧开始DHTff c4霍夫曼(Huffman)表SOSff da扫描行开始EOIff d9文件结束

首先是两个比较简单和特殊的块:

FFD8、FFD9-SOI、EOI-文件开始与结束 名称二进制数含义SOIff d8文件开始EOIff d9文件结束

需要注意截图中Sublime自动按两个字节一组显示的,但实际上ff并不一定只出现在第单数个字节处,有可能ff和标记符间隔着一个空格。

(也就是说你按[标记符+空格]进行搜索,不一定能找到全部的分块)

FFE0-APP0-图像识别信息

0010指该块长度为16个字节(不包括ffe0)

4a46 4946 00是JFIF格式标识码

01 01是版本号(第一个01是主版本号,第二个01是次版本号)

01是单位(00=无单位;01=点数/英寸;02=点数/厘米)

0078为水平分辨率

0078为竖直分辨率

00为水平点数

00为竖直点数

FFDB-DQT-定义量化表

一共有两个DQT块,它们ffdb后面都紧跟着一个0043,意味着这两个DQT块的长度(不包括ffdb)都为67个字节。

DQT块定义了图像的量化表,参与到图像的压缩中,我没有用到这一部分,暂时不讲(以后用到了再补)

FFC0-SOF0-图像基本信息

同样的,0011指示了SOF0块长度为17个字节。

前8个字节分别为:

字节数示例中的值示例中的含义20011SOF0块长度为17个字节108每个像素的每个颜色分量为8位202 0d图片高度为525(直接换算成十进制)202 5a图片宽度602(直接换算成十进制)103组件数量为3

JPEG一般采用yCrCb格式,因此最后的组件数量通常为3(每个组件就是像素的一个颜色分量)

y指的是亮度;Cr指的是红色分量;Cb指的是蓝色分量。

每个组件包含三个字节:

101  |  02  |  0301=Y;02=Cb;03=Cr;04=I;05=Q122  |  11  |  110~3位=竖直采样系数;4~7位=水平采样系数100  |  01  |  01量化表号

第一个字节指示这个组件是什么,除了之前说的y、Cr、Cb以外,还有I和Q。

I和Q是YIQ色彩空间中使用的,y是亮度,I代表In-phase,色彩从橙色到青色,Q代表Quadrature-phase,色彩从紫色到黄绿。

FFC4-DHT-定义Huffman表

示例中共有4张Huffman表,分别为亮度AC(交流)、亮度DC(直流)、色度AC、色度DC。

(暂时没弄太明白,之后补充)

FFDA-SOS-扫描行开始

紧跟着ffda的000c描述段长度,值为6+[组件数量],这里组件数量为3。

之后的03表示组件数量为3,这里的值必须在1到4之间。

01表示组件号码为1(y),00的0-3位:AC表号 (值=0~3),4-7位:DC表号(值=0~3)

在SOS后记录的就是图像数据,从左到右从上到下依次排列。(是经过压缩算法处理过后的)

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。