1.引言
为了构筑非现场执法平台,电子警察抓拍的图片至少要包含如下信息才能保证处理的合法性:违法地点、违法时间、行驶方向、车道、车速等称之为抓拍信息。
目前抓拍信息普遍采用的存储方式是将除违法时间以外的信息以代码的形式组合在一起形成字符串作为抓拍图片的文件名,由处理系统对照数据库表中的设置进行信息解析。
例如某一张图片的图片名为"00231001020002763",解析如下:
前三位002代表路口名
第四位3代表南方向
第五位1代表车道1
第六到八位001代表红灯后1秒抓拍
第九位到底十一位020代表当时车速为20km/s
第十二位到第十七位002763表示图片的序号为002763
其违法时间通过JPEG图片文件的修改时间获得。
目前采用的抓拍信息存储方式要求图片从前端抓拍主机通过网络传输或移动硬盘拷贝到中心,然后录入数据库作为一条完整的违法记录,这中间文件名和文件的修改时间不能被改动。由于文件名,修改时间都是通过操作系统来维护,违法信息被修改的可能性很大。
针对以上缺点,考虑利用Exif格式将抓拍信息插入到JPEG文件中进行存储。这样,除非JPEG文件被删除,抓拍信息被意外修改、删除的可能性几乎为零。
2.Exif格式简介
为了实现在不同的软件或设备之间交流图像数据,日本电子与信息工业技术协会制定了一项标准,称为Exif(Exchangeableimagefileformat的缩写),即可交换图像文件格式。Exif包含很丰富的信息,包括拍摄照片所用相机的品牌,拍摄时间,光圈,速度等,其主要的目的是应用于数码相机。
加入Exif信息的JPEG文件遵从JPEG标准,只是在普通的JPEG文件头部加入Exif信息,Exif是利用JPEG文件的一个APP1和APP2两个段来记录信息的。
所有的JPEG文件以字符串"0xFFD8"开头,并以字符串"0xFFD9"结束,文件头中一系列的"0xFF??"格式字符串称为"标识",用来标记JPEG文件的信息段,"0xFFD8"表示图像信息开始,"0xFFD9"表示图像信息结束,这两个标识后面没有信息,而其它标识紧跟一些信息字符。
0xFFE0--0xFFEF之间的标识符称为"应用标记",没有被常规JPEG文件利用,Exif正是使用其中的0xFFE1和0xFFE2段来记录制造商,光圈等信息的,称这两段为APP1与APP2,其中APP2使用较少。
起始长度(Byte)内容
0x002APP1段标识(0xFFE1)
0x022APP1段的长度
0x04Length-2Exif数据
表格1APP1段格式
起始长度(Byte)内容
0x006Exif信息头部
0x02APP1Length-8TIFF信息头部
表格2Exif格式
起始长度(Byte)内容
0x002字节顺序
0x022标识
0x044第一个IFD相对于TIFF信息头部偏移量
表格3TIFFImageFileHeader格式
图表1IFD链表结构
起始长度(Byte)内容
0x002DirectoryEntries的数量
0x0212*DirectoryEntries的数量DirectoryEntries
2+12*DirectoryEntries的数量4下一个IFD相对于TIFF信息头部偏移量
表格4IFD的结构
每个IFD由三个部分组成,如表4所示,包括:NumberofDirectoryEntries,DirectoryEntries和OffsetofnextIFD。其中NumberofDirectoryEntries指定在DirectoryEntries中包含多少个Entry。DirectoryEntries是一个数组,包含若干个DirectoryEntry。最后的OffsetofnextIFD即是下个IFD所在的位置,如果此项为0,则表示这是链表中的最后一个IFD。
IFDEntry是一个12字节长的结构,如上表所示。所有的IFDEntry都是通过Tag来标识的,每一个Tag都是一个WORD类型的数值,每个数值有其特定的含义。如0x0131这个Tag表示此Entry记录的是生成此TIFF文件的软件名,010F表示数码相机得制造商等。数据类型包括BYTE,ASCII,LONG等,值代表标记的内容。如果Value的内容大于四个字节,则Value表示实际内容相对于TIFF头部的偏移量。
起始长度(Byte)内容
0x002标记(Tag)
0x022类型(Type)
0x044大小(Size)
0x084值(Value)
表格5IFDEntry结构
3.抓拍信息储存解决方案
Exif信息作为JPEG文件的一部分在文件的复制,剪切过程中不会丢失,用户也不能轻易修改,同时可以记录相当多的信息,例如通过佳能数码相机拍摄的照片可以记录大概四五十项信息,这些特性符合存储抓拍信息的要求,针对目前在存储抓拍信息是出现的问题,考虑在每张图片中加入Exif信息。
加入Exif信息有两种方式:
方式一:利用国际上为数码相机定义的规范标记,缺点是选取标记时需考虑标记的类型,优点是普通的图片查看软件可以查看抓拍信息。
例如:标记0x010F在Exif2.2中表示制造商,即拍摄设备的生产商,可以利用此标记作为电子警察抓拍设备的抓拍地点。
方式二:自定义标记,利用Exif2.2中未使用的标记作为存储抓拍信息的标记,优点是更加灵活方便,缺点是需自己编写抓拍信息查看软件。
序号名称类型长度Exif标记说明
1违法时间字符200x1001
2违法地点字符20x1002
3行驶方向字符10x10031-由东至西2-由西至东
3-由南至北4-由北至南
4车道字符30x1004左1,左2…
直1,直2…
5车速字符30x1005
表格6自定义Exif标记表示抓拍信息
抓拍到的图片通过Exif嵌入抓拍信息后,丰富了信息含量,相对于目前的抓拍信息储存方式,以Exif格式存储可以不考虑存储路口、方向等信息的代码,而是直接以字符串形式存储路口名称,方向名称等,每一张图片不需通过入库软件对比数据库信息进行解析,就能够获取完整的违法信息。
4.具体操作
利用Exif存储信息在电子警察系统中的应用中包括两个部分:前端抓拍软件信息插入和中心违法处理软件信息解析。详细操作如下:
信息插入过程:
1.将抓拍到的四张图片(一张特写,三张全景)合为一张图片,以JPG格式保存。
2.获取抓拍时间,地点,方向等抓拍信息。
3.将抓拍信息按约定的标记形成Exif格式的字节流。
4.将Exif字节流插入到JPEG文件头部。
代码示例:
OldStream.LoadFromFile(FFilename);
NewStream.CopyFrom(OldStream,20);
NewStream.WriteBuffer(Buffer1,38);
NewStream.WriteBuffer(FPeccancyInfo.WFDD,2);//插入违法地点
NewStream.WriteBuffer(Buffer2,8);
NewStream.WriteBuffer(FPeccancyInfo.XSFX,1);//插入行使方向
NewStream.WriteBuffer(Buffer3,21);
NewStream.WriteBuffer(FPeccancyInfo.CS,3);//插入车速
NewStream.WriteBuffer(Buffer4,5);
NewStream.WriteBuffer(FPeccancyInfo.WFSJ,19);//插入违法时间
NewStream.WriteBuffer(Buffer5,1);
NewStream.WriteBuffer(FPeccancyInfo.CD,5);//插入车道
NewStream.WriteBuffer(Buffer5,1);
NewStream.CopyFrom(OldStream,OldStream.Size-20);
NewStream.Position:=0;
JPEG.LoadFromStream(NewStream);
JPEG.SaveToFile(FFilename);
信息解析过程:
1.以流格式读取JPEG文件。
2.获取APP1段字节流。
3.根据约定标记解析抓拍信息。
4.存储、显示抓拍信息。
代码示例:
MStream:=TMemoryStream.Create;
MStream.LoadFromFile(CurrentDir+Filename+'.jpg');
MStream.Seek(58,soFromBeginning);
MStream.ReadBuffer(WFDD,2);//违法地点
MStream.Seek(68,soFromBeginning);
MStream.ReadBuffer(XSFX,1);//行使方向
MStream.Seek(90,soFromBeginning);
MStream.ReadBuffer(CS,3);//车速
MStream.Seek(98,soFromBeginning);
MStream.ReadBuffer(WFSJ,19);//违法时间
MStream.Seek(118,soFromBeginning);
MStream.ReadBuffer(CD,5);//车道
5.结语
如上分析,基于Exif格式存储抓拍信息可以解决现有存储方案所遇到的问题,同时可以扩展信息量,实现过称也相当简单。
作者简介
张锋鑫:连云港杰瑞电子有限公司ITS事业部软件工程师,拥有丰富ITS行业软件开发、系统集成经验。关注新技术,探索新技术与ITS行业需求的融合。
高渊:连云港杰瑞电子有限公司ITS事业部经理。拥有丰富ITS行业软件开发、系统集成经验。