写作背景
工作原因,临时需要在内存中解析JPEG2000格式的码流图片,(本来opencv是支持读写jpeg2000格式的图片的,但由于图片是在内存中,无法通过imread函数读取磁盘图片,因此不能使用opencv),由于网上JPEG2000的资料十分少,中间过程也是有点坎坷。为了帮助大家更好的理解JPEG2000图片的码流格式,这里放上自己的笔记。
格式简介
先放上JPEG2000的格式,可以看到图片是由很多的box组成的,每个box代表着一些图片信息,如File Type Box表示文件的类型,Contiguous Codestream Box表示压缩图片内容数据流。下下张图是一个jp2格式的图片的二进制码流形式,接下来是通过这个图片的码流形式进行一个解析,来说明每一个字节所代表的含义。


1. JPEG2000 Signature box
这个box是表明了该文件的格式是JPEG2000协议的图片格式,该box的类型标识为'j', 'P', ' ', ' '四个字符组成,对应的十六进制为0x6A50 2020,box的内容为0x0D0A 870A,这个box的总长度为12个字节,0x0000 000C 6A50 2020 0D0A 870A。
范围:二进制文件中的0 - 11byte位
2. File Type box
该box类型标识为‘ftyp'(0x6674 7970),内容为'jp2 '(0x6A70 3220),长度位12个字节
范围:二进制文件中的12 - 23byte位,后面的24-148位暂时不明白啥意思,应该也是支持的格式吧,不影响读取,但是试验下面的四个字节还是有用的。
3. JP2 Header box (superbox)

3.1 Image Header box
该box紧跟JP2 Header box之后,标识位'ihdr'(0x6968 6472),该box包含了图片的基本尺寸信息,如图像大小、通道数等。
box的内容如下表,紧跟'ihdr'之后的是图像的高度HEIGHT占4个字节、宽度WIDTH占4个字节、通道数NC占2个字节、BPC、C、UnkC、IPR分别占一个字节,共14个字节。
范围:二进制文件中的157 - 178byte位

3.2 Colour Specification box
该box标识位'colr'(0x0x636F 6C72)
范围:二进制文件中的179 - 193byte位

3.3 Resolution box (superbox)


3.4 Contiguous Codestream box
该box之后就是压缩的连续数据流了,box类型标识为 'jp2c' (0x6A70 3263),之后就是FF4F开始的数据流部分,这部分内容较多,分下一篇文章讲解。
举例2
1. JPEG2000 Signature box(0 - 11)
这个是必须要有的:00 00 00 0C, 6A 50 20 20, 0D 0A 87 0A
2. File Type box(12 - 23)
00 00 00 14, 66 74 79 70, 6A 70 32 20
3. JP2 Header box (superbox)(24 - 31)
00 00 00 2D, 6A 70 32 68
3.4 Contiguous Codestream box(69 - 76)
00 00 00 00, 6A 70 32 63