发明名称 基于JPEG文件流的图片分割方法
摘要 本发明公开了一种基于JPEG文件流的图片分割方法,步骤包括:步骤1、根据JPEG编码原理以及其数据流格式,获取图片的大小、重入间隔、采样因子信息;步骤2、根据JPEG图片大小和读出的重入间隔数计算图片的分割块数;步骤3、根据上述所分块数对JPEG图片进行分块,循环对JPEG图片进行分块读取。本发明的方法,有效的解决了尺寸各异尤其是超大图片耗费大量内存与时间,效率低下的问题,具有内存使用量小且稳定等优势。
申请公布号 CN103778631B 申请公布日期 2017.01.18
申请号 CN201410020259.2 申请日期 2014.01.16
申请人 西安理工大学 发明人 孙钦东;贺毅;王艳;张景鹏;王健
分类号 G06T7/00(2006.01)I;G06T9/00(2006.01)I 主分类号 G06T7/00(2006.01)I
代理机构 西安弘理专利事务所 61214 代理人 李娜
主权项 一种基于JPEG文件流的图片分割方法,其特征在于,按照以下步骤具体实施:步骤1:根据标准JPEG文件的数据流格式,读取JPEG图片的大小和位置、分辨率、头文件结束位置、重入间隔数以及采样因子,参照表1中的JPEG文件的数据流格式实施;表1,标准JPEG文件的数据流格式<tables num="0001" wi="165"><table><tgroup cols="3"><colspec colname="c001" colwidth="21%" /><colspec colname="c002" colwidth="30%" /><colspec colname="c003" colwidth="49%" /><tbody><row><entry morerows="1">段名</entry><entry morerows="1">标识码(Tag)</entry><entry morerows="1">说明</entry></row><row><entry morerows="1">SOI</entry><entry morerows="1">FFD8</entry><entry morerows="1">图像开始</entry></row><row><entry morerows="1">APP0</entry><entry morerows="1">FFE0</entry><entry morerows="1">JFIF应用数据块</entry></row><row><entry morerows="1">APPn</entry><entry morerows="1">FFE1‑FFEn</entry><entry morerows="1">其他的应用数据块,n=1~15</entry></row><row><entry morerows="1">DQT</entry><entry morerows="1">FFDB</entry><entry morerows="1">量化表</entry></row><row><entry morerows="1">SOF0</entry><entry morerows="1">FFC0</entry><entry morerows="1">帧开始</entry></row><row><entry morerows="1">DHT</entry><entry morerows="1">FFC4</entry><entry morerows="1">霍夫曼表</entry></row><row><entry morerows="1">SOS</entry><entry morerows="1">FFDA</entry><entry morerows="1">扫描线开始</entry></row><row><entry morerows="1">EOI</entry><entry morerows="1">FFD9</entry><entry morerows="1">图像结束</entry></row></tbody></tgroup></table></tables>步骤2:根据JPEG图片大小和读出的重入间隔数计算图片的分割块数步骤2.1)根据步骤1获取的JPEG图片中不同颜色的采样因子,即Y、Cr、Cb三个分量各自的水平采样因子和垂直采样因子,确定最小编码单元MCU的大小;步骤2.2)根据步骤1中读出的JPEG图片宽度和步骤2.1)中得出的MCU的宽度大小计算宽度下的MCU的个数C,则有:C=W/w',其中的W为图片宽度,w'为MCU的宽度,若所求C不为整数,则将C取整数部分后加1;步骤2.3)根据步骤1读出的重入间隔数和C的个数计算每个重入间隔下的高度方向MCU的个数C',则有:C'=I/C,其中的I为重入间隔大小,C为宽度下的MCU的个数,进而计算出每个重入间隔的高度h,则有:h=C'*h',其中的h'为MCU高度;步骤2.4)计算重入间隔的数目D,则有:D=H/h',其中的H为图片高度,h'为MCU高度;步骤2.5)根据表1中的标准JPEG文件的数据流格式,将MCU块的单元中的重新开始间隔设为n,则表示每n个MCU块就有一个RST<sub>n</sub>标记,第一个标记是RST<sub>0</sub>,第二个是RST<sub>1</sub>,以此类推,RST<sub>7</sub>后再从RST<sub>0</sub>重复,根据以上描述计算重入的0XFFD7的个数N',N'=D/8,若结果不为整数则取出不满足8的倍数的重入间隔数L,则有:L=D%8;步骤2.6)根据步骤2.5)计算出的重入0XFFD7的个数N'确定一个基数N,计算JPEG图片所分块数A,则有:A=N'/N,若所求块数不为整数,则计算余数M=N'%N,若余数M为8的整数倍,则A=A+1,否则A=A+2;步骤3、根据所分块数A对JPEG图片进行分块,循环对JPEG图片进行分块读取,按照三种具体情况分别进行读取,三种情况的具体读取过程是:情况一:当读取的块不是最后2块时,其余块的处理情况相同,根据步骤1读取的采样因子确定的每个MCU的高度以及分块基数N确定每块的高度H',则有:H'=8*h'*N,其中的h'为MCU的高度,N为分块基数,8为0XFFDn的个数,在JPEG文件头数据流的高度所在位置修改该块的图片高度,读取N个0xFFD7的数据流并在读取的JPEG文件流的末尾写入0XFFD9,即JPEG文件流的结束标记,将该数据流进行读取;情况二:当读取的块为倒数第二块,即不够基数N倍的0XFFD7的整数倍,则每块高度H”=S*h'*8,其中的S为剩余的0XFFD7的个数,h'为MCU高度,8为0XFFDn的个数,读取文件头数据流,在文件头数据流的高度位置修改块高度,读取S个0xFFD7的数据流并在读取的JPEG文件流的末尾写入0XFFD9,将该数据流进行读取;情况三:当读取的块为最后一块,每块高度H”',则有:H”'=H‑H'*(A‑2)‑H”,其中的H为原图片高度,H'为情况一分块的块高,A为分的总块数,H”为情况二分块的高度,读取文件头数据流,在文件头数据流的高度位置修改块高度,读取剩余的JPEG文件数据流。
地址 710048 陕西省西安市金花南路5号