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#编码开发工具,紧凑型和松散型切片可以互转了,经测试在平板桌面都没问题 。