by 蔡建良 2018-8-24
网络中我看到的网文将bundle存储切片数据的方式都没说清或是说错。按照错误方法一样可以在桌面浏览,但在arcgis for android却无法浏览。
bundlx存储格式的分析:
1) 每个bundlx文件的大小都是81952 字节(我这里PacketSize是128),前面16字节 + 每个图片偏移量5字节 * (128 * 128)个切片 + 结尾16字节。
2) 每个bundle文件中最多存储16384个切片。
3) 文件起始16字节和文件结束16字节与索引无关。
起始16字节: { 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00 }
结束16字节: { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
4) 剩余的81920字节数据以5个字节的频率重复,构成了一个对bundle文件的索引。
5) 5个字节是以低位到高位的方式标示了数据的偏移量(在bundle文件中的地址)。
6) bundlx中的每5个字节标示的到底是哪个切片的数据偏移?
按列-行存储:先是1列1行、1列2行……2列1行、2列2行……这样写的位置。
bundle存储格式的分析:
1) 从0x00到0x3b的这些位置都是bundle文件的描述信息。
0-7: 固定
8-b: 所有瓦片当中文件大小最大的一张切片的文件大小的数值
c-f: 固定
10-13: 表示非空文件个数*4
14-17: 固定
18-1b: bundle文件大小
1c-1f: 固定
20-2b: 固定
2c-2f: 开始行
30-33: 结束行
34-37: 开始列
38-3b: 结束列
2) bundle文件里从0x3c->0x1003c这些位置是为空切片预留了偏移位置。
3) bundle中的切片数据是如何存储?
按行-列存储:先是1行1列、1行2列……2行1行、2行2列……这样写的位置。(这个与bundlx相反)
依次按照行列顺序开始写切片,如果遇到空的,就指向0x3c->0x1003c的空位置段,
比如第r行第c列切片是空的,对应的位置就是 0x3c + ((c - colStart) * this.m_packetSize + (r - rowStart)) * 4。
4) 非空切片在bundle文件里是从0x1003c开始写的。
5) 找到非空切片存储的偏移位置,接下来的4个字节是该image的长度,
然后在这4个字节之后取这些长度的字节就组合成了一副图像。
按照以上存储格式采用C#编码开发工具,紧凑型和松散型切片可以互转了,经测试在平板桌面都没问题 。