一种自动化检验JPEG图片是否正常的方法与流程

文档序号:11286341阅读:347来源:国知局
本发明涉及碎片图片重组领域,特别涉及一种自动化检验jpeg图片是否正常的方法。
背景技术
::jepg是一种比较常见的图片格式,在存储介质上创建文件后对文件进行删除、修改会造成文件内容的丢失或者碎片化,通过row扫描等恢复方法当对其进行数据修复后,得到的图片很有可能不是一张完整或者说正常的图片,当存储介质中存有大量jepg图片时,此时若人为判断恢复的图片是否正常将是一个非常耗时耗力的工作。技术实现要素:本发明针对现有技术的不足,提供了一种自动化检验jpeg图片是否正常的方法,用以解决人为判断恢复的图片是否正常耗时耗力的问题。为解决以上问题,本发明采用的技术方案如下:一种自动化检验jpeg图片是否正常的方法,步骤如下:s1读取图片数据,图片数据分为文件头信息和文件信息;s2在读取的图片文件头信息中查找soi标记位,也就是ffd8数据,若不存在则认为此图片不正常,存在则表示此处为图片文件的开始标记;s3检验dqt量化表标记,查找ffdb标记位,该标记位后为2byte表示长度的数据,根据此长度,检验标记位后此长度的这段数据;检验dht量化表标记,查找ffc4标记位,标记位后为2byte表示长度的数据,根据此长度,检验标记位后此长度的这段数据;检验sofo帧图开始标记,查找ffc0标记位,包含9个具体字段,一一检验字段是否符合规则,若不符合则为不正常;检验sos帧图开始标记,查找ffda标记位,包含2个具体字段,一一检验字段是否符合规则,若不符合则为不正常;s4检验eoi图像结束,在读取的图片文件头信息中查找eoi标记位,也就是ffd9数据,若不存在则认为此图片不正常,存在则表示此处为图片文件的结束标记。作为优选,检验dqt量化表标记具体如下:第1byte为精度及量化表id,高4位:精度,只有两个可选值0和1,0表示8位;1表示16位,低4位:量化表id,取值范围为0~3;再后面是表项,长度为64*(精度+1)byte。作为优选,检验dht量化表标记具体如下:第1byte为编码表类型和表id,高4位:类型,只有两个值可选0和1,0表示dc直流;1表示ac交流;低4位:哈夫曼表id,dc表和ac表分开编码;再后面数据长度为16+nbyte。本发明的有益效果如下:通过本发明的方法可以自动检验jpeg图片是否正常,解决了人为判断恢复的图片是否正常耗时耗力的问题。附图说明图1为本发明实施例的流程示意图。具体实施方式为使本发明的目的、技术方案及优点更加清楚明白,以下参照附图并举实施例,对本发明做进一步详细说明。原理介绍:(一)jpeg文件格式介绍jpeg文件使用的数据存储方式有多种。最常用的格式称为jpeg文件交换 格式(jpegfileinterchangeformat,jfif)。而jpeg文件大体上可以分成两个部分:标记码(tag)和压缩数据。标记码由两个字节构成,其前一个字节是固定值0xff,后一个字节则根据不同意义有不同数值。在每个标记码之前还可以添加数目不限的无意义的0xff填充,也就说连续的多个0xff可以被理解为一个0xff,并表示一个标记码的开始。而在一个完整的两字节的标记码后,就是该标记码对应的压缩数据流,记录了关于文件的诸种信息。常用的标记有soi、app0、dqt、sof0、dht、dri、sos、eoi。注意,soi等都是标记的名称。在文件中,标记码是以标记代码形式出现。例如soi的标记代码为0xffd8,即在jpeg文件中的如果出现数据0xffd8,则表示此处为一个soi标记。下面仅列出几个常用标记的标记代码、占用字节长度和表示的意义。soi,startofimage,图像开始标记代码2字节固定值0xffd8app0,application,应用程序保留标记0标记代码2字节固定值0xffe0appn,application,应用程序保留标记n,其中n=1~15(任选)标记代码2字节固定值0xffe1~0xfffdqt,definequantizationtable,定义量化表标记代码2字节固定值0xffdbsof0,startofframe,帧图像开始标记代码2字节固定值0xffc0dht,difinehuffmantable,定义哈夫曼表标记代码2字节固定值0xffc4dri,definerestartinterval,定义差分编码累计复位的间隔标记代码2字节固定值0xffddsos,startofscan,扫描开始标记代码2字节固定值0xffdaeoi,endofimage,图像结束标记代码2字节固定值0xffd9补充说明,由于在jpeg文件中0xff具有标志性的意思,所以在压缩数据流(真正的图像信息)中出现0xff,就需要作特别处理。具体方法是,在数据0xff后添加一个没有意义的0x00。换句话说,如果在图像数据流中遇到0xff,应该检测其紧接着的字符,如果是1)0x00,则表示0xff是图像流的组成部分,需要进行译码;2)0xd9,则与0xff组成标记eoi,则图像流结束,同时图像文件结束;3)0xd0~0xd7,则组成rstn标记,则要忽视整个rstn标记,即不对当前0xff和紧接的0xdn两个字节进行译码,并按rst标记的规则调整译码变量;4)0xff,则忽视当前0xff,对后一个0xff再作判断;5)其他数值,则忽视当前0xff,并保留紧接的此数值用于译码。(二)jpeg解码过程详解(1)读入jpeg/jfif文件的相关信息按照jfif文件格式,将jpeg文件相关的字段信息一一读取出来,并进行相应的解析。例如,图像的宽度、高度、量化表、huffman表、水平/垂直采样因子等。一般而言,jfif格式文件的读取顺序依次为:soi字段;app0字段;appn字段;dqt字段;sofo字段;dht字段;sos字段;压缩数据字段;eoi 字段;读取jpeg文件相关信息的时候,有两点需要特别注意:(a)由于jpeg中以0xff来做为特殊标记符,因此,如果某个像素的取值为0xff,那么实际在保存的时候,是以0xff00来保存的,从而避免其跟特殊标记符0xff之间产生混淆。所以,在读取文件信息的时候,如果遇0xff00,就必须去除后面的00;即,将0xff00当做0xff;(b)jpeg文件中,一个字(16位)的存储是采用了motorola格式(big-endian),而不是我们常用的intel格式(little-endian)。因此,如果需要的话,请在处理之间进行依次高低字节的转换。(2)读取huffman表在标记码dht之后,包含了一个或者多个huffman表(通常是4个表)。(3)构建huffman树读取到huffman表的数据之后,就需要构建huffman树了。其具体规则如下(a)第一个编码的数字必定为0;如果第一个编码的位数为1,就被编码为0;如果第一个编码的位数为2,就被编码为00;如果第一个编码的位数为3,就被编码为000…(b)从第二个编码开始,如果它和它前面编码具有相同的位数,则当前编码是它前面的编码加1;如果它的编码位数比它前面的编码位数大,则当前编码时它前面的编码加1之后再在后面添加若干个0,直到满足编码位数的长度为止。(4)dc系数的huffman解码dc系数是以(a,b)的中间形式进行编码的。其中的a代表了b的二进制 编码位数,b则利用vli进行编码。(5)ac系数的huffman解码通过查找ac系数的huffman编码表,进行解码,我们得到(a,b)的数据对,其中的a代表了0的个数,而b则代表了后面数据的位数。读取b位二进制数据,进行译码,我们就得到了ac系数的值。(6)反量化在译码得到了8*8的系数矩阵之后,我们需要进行反量化工作。该步骤,就是将前一个步骤得到的8*8系数矩阵分别乘以8*8的量化矩阵即可。(7)反zig-zag扫描jpeg编码过程中,为了编码方便,采用了zig-zag扫描,因此,这里需要进行反zig-zag扫描,重新排列8*8的反量化系数矩阵。反zig-zag扫描的输入时8*8矩阵,输出依然是8*8矩阵,只不过,数据的排列方式有所不同而已。(8)dct逆变换dct变换,将原始图像变换到频域,而dct逆变换,就是要将数据从频域变换回时域。dct逆变换的计算公式为:其中,当u,v=0时,当u,v≠0时,c(u),c(v)=1(9)颜色模式转换bmp图片是以rgb颜色空间进行保存的,因此,将jpeg解码为bmp必须进行颜色模式的转换。另外,由于dct要求的定义域对称,所以,在编码的时候将rgb的数值范围从[0,255]统一减去128,将数值范围转换到[-128,127]的范 围内。因此,解码的时候,必须为每个颜色分量加上128。另外需要注意的是,通过解码变换之后得到的rgb的值有可能超过255或者小于0;如果小于0,就截断为0,如果大于255,就截取为255;基于上述原理,本发明提出了一种自动化检验jpeg图片是否正常的方法,步骤如下:1.读取jpeg图片的数据,其必须包括数据为:soi+dqt+dht+sofo+sos+压缩数据+eoi当获取图片数据时,检测到数据中这部分数据缺失或者此部分数据不正确则认为此图片为不正常图片,既可以将其归为不正常图片类,这样就可以快速将不正常的图片区分出来。如图1所示,下面对这些标记位的检验做具体说明:(特别说明:具体顺序101->102->(103,104,105,106)->107->108->109,其中的103,104,105,106这4个可以是乱序的);以下所有步骤只要出现错误就认为图片不正常,既终止此后的操作,不再继续往后检验。101读取图片数据,图片数据分为文件头信息和文件信息;102在读取的图片文件头信息中查找soi标记位,也就是ffd8数据,若不存在则认为此图片不正常,存在则表示此处为图片文件的开始标记;103检验dqt量化表标记,查找ffdb标记位,该标记位后为2byte表示长度的数据(不含标记位),根据此长度,检验标记位后此长度的这段数据,第1byte为精度及量化表id,高4位:精度,只有两个可选值0和1,0表示8位;1表示16位,低4位:量化表id,取值范围为0~3;再后面是表项,长度为64*(精度+1)byte。本标记段中,字段②可以重复出现,表示多个量化表,但最多只能出现4次。dqt表示定义量化表,包含9个具体字段:①数据长度2字节字段①和多个字段②的总长度即不包括标记代码,但包括本字段②量化表数据长度-2字节a)精度及量化表id1字节高4位:精度,只有两个可选值0表示8位;1表示16位低4位:量化表id,取值范围为0~3b)表项(64×(精度+1))字节一般地,qt表id为0时表示亮度量化表,qt表id为1时表示色度量化表。104检验dht量化表标记,查找ffc4标记位,标记位后为2byte表示长度的数据(不含标记位),根据此长度,检验标记位后此长度的这段数据,第1byte为编码表类型和表id,高4位:类型,只有两个值可选0和1,0表示dc直流;1表示ac交流;低4位:哈夫曼表id,注意,dc表和ac表分开编码。再后面数据长度为16+nbyte。本标记段中,字段②可以重复出现(一般4次),也可以只出现1次。dht定义哈夫曼表,包含2个具体字段:①数据长度2字节字段①和多个字段②的总长度即不包括标记代码,但包括本字段②哈夫曼表数据长度-2字节a)表id和表类型1字节高4位:类型,只有两个值可选0表示dc直流;1表示ac交流低4位:哈夫曼表id,注意,dc表和ac表分开编码b)不同位数的码字数量16字节c)编码内容16个不同位数的码字数量之和(字节)105检验sofo帧图开始标记,查找ffc0标记位,包含9个具体字段,一一检验以下字段是否符合规则,若不符合则为不正常。sofo表示帧图像开始包含9个具体字段:①数据长度2字节①~⑥六个字段的总长度即不包括标记代码,但包括本字段②精度1字节每个数据样本的位数通常是8位,一般软件都不支持12位和16位③图像高度2字节图像高度(单位:像素),如果不支持dnl就必须>0④图像宽度2字节图像宽度(单位:像素),如果不支持dnl就必须>0⑤颜色分量数1字节只有3个数值可选1表示灰度图;3表示ycrcb或yiq;4表示cmyk而jfif中使用ycrcb,故这里颜色分量数恒为3⑥颜色分量信息颜色分量数×3字节(通常为9字节)a)颜色分量id1字节b)水平/垂直采样因子1字节高4位:水平采样因子低4位:垂直采样因子c)量化表1字节当前分量使用的量化表的id本标记段中,字段⑥应该重复出现,有多少个颜色分量(字段⑤),就出 现多少次(一般为3次)。说明:此例中ffc0字段长度为0x11,数据精度8,图像高度0x0326,宽度0x0226,颜色组件数量为3(ycbcr/yiq彩色图),颜色组件1:012202,01为组件编号,22表示该颜色的水平采样系数2,垂直采样系数2,量化表02颜色组件2:021101颜色组件3:031101jpg的mcu(minimuncodedunix最小编码单元)是一个(hmax*8,vmax*8)的块,所以此例中mcu的大小为16*16=256byte106检验sos帧图开始标记,查找ffda标记位,包含2个具体字段,一一检验以下字段是否符合规则,若不符合则为不正常。sos表示扫描开始,包含2个具体字段:①数据长度2字节①~④两个字段的总长度即不包括标记代码,但包括本字段②颜色分量数1字节应该和sof中的字段⑤的值相同,即:1表示灰度图是;3表示ycrcb或yiq;4表示cmyk。而jfif中使用ycrcb,故这里颜色分量数恒为3③颜色分量信息a)颜色分量id1字节b)直流/交流系数表号1字节高4位:直流分量使用的哈夫曼树编号低4位:交流分量使用的哈夫曼树编号④压缩图像数据a)谱选择开始1字节固定值0x00b)谱选择结束1字节固定值0x3fc)谱选择1字节在基本jpeg中总为00本标记段中,字段③应该重复出现,有多少个颜色分量(字段②),就出现多少次(一般为3次)。本段结束后,紧接着就是真正的图像信息了。图像信息直至遇到一个标记代码就自动结束,一般就是以eoi标记表示结束。107检验eoi图像结束,在读取的图片文件头信息中查找eoi标记位,也就是ffd9数据,若不存在则认为此图片不正常,存在则表示此处为图片文件的结束标记2.按照解码步骤对图片进行解码108当解码过程中某个步骤出现错误,不能完成解码,则也认为图片为不正常的图片,将其归到不正常图片类中。109当上面所有步骤都正确的情况下,则认为此图片为正常图片,否则只要某一个步骤出错则认为图片不正常。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1