mirror of
https://github.com/ddv2005/AirsoftTracker.git
synced 2025-07-27 07:09:33 +00:00
121 lines
4.5 KiB
Python
121 lines
4.5 KiB
Python
import json
|
|
import sys
|
|
import os.path
|
|
import io
|
|
import astc_conv
|
|
from os import path
|
|
from PIL import Image
|
|
|
|
def pad(o, m):
|
|
if m>0 :
|
|
barray = bytearray(m)
|
|
for i in range(0,m):
|
|
barray[i] = 0xFF
|
|
o.write(barray)
|
|
return
|
|
|
|
|
|
def alignFile(o, position, aligment):
|
|
m = position % aligment
|
|
if m>0 :
|
|
m = aligment-m
|
|
barray = bytearray(m)
|
|
for i in range(0,m):
|
|
barray[i] = 0xFF
|
|
o.write(barray)
|
|
return m
|
|
|
|
|
|
def loadImage(filenameBase,x,y):
|
|
filename = filenameBase+str(x)+'/'+str(y)+'.png'
|
|
if path.exists(filename):
|
|
im=Image.open(filename)
|
|
return im
|
|
return None
|
|
|
|
def main():
|
|
folder = sys.argv[1]
|
|
output = sys.argv[2]
|
|
print('Processing '+folder)
|
|
tmeta = {}
|
|
position = 0
|
|
with open(folder+'/metadata.json') as f:
|
|
meta = json.load(f)
|
|
tmeta['name'] = meta['name']
|
|
tmeta['bounds'] = [meta['extent'][0],meta['extent'][3],meta['extent'][2],meta['extent'][1]]
|
|
tmeta['tile_matrix'] = []
|
|
with io.open(output, 'wb') as o:
|
|
for zl in meta['tile_matrix']:
|
|
zitem = {}
|
|
zitem['id'] = zl['id']
|
|
zitem['bounds'] = [zl['origin'][0],zl['origin'][1],zl['extent'][2],zl['extent'][1]]
|
|
zitem['images'] = []
|
|
zitem['pixel_size'] = zl['pixel_size']
|
|
zitem['tile_size'] = [zl['pixel_size'][0]*zl['tile_size'][0],zl['pixel_size'][1]*zl['tile_size'][1]]
|
|
xc = zl['origin'][0]
|
|
yc = zl['origin'][1]
|
|
xp = zl['pixel_size'][0]
|
|
yp = zl['pixel_size'][1]
|
|
fmt = 37808
|
|
hasImages = False
|
|
if zl['matrix_size'][0]*zl['matrix_size'][1] >=8:
|
|
fmt = 37812
|
|
for x in range(zl['matrix_size'][0]):
|
|
for y in range(zl['matrix_size'][1]):
|
|
filenameBase = folder+'/'+zl['id']+'/'
|
|
filename = filenameBase+str(x)+'/'+str(y)+'.png'
|
|
if path.exists(filename):
|
|
im=Image.open(filename)
|
|
expand = 1
|
|
nim = Image.new('RGBA',(im.size[0]+expand*2,im.size[1]+expand*2))
|
|
nim.putalpha(0)
|
|
nim.paste(im,(expand,expand))
|
|
|
|
pim = loadImage(filenameBase,x,y-1)
|
|
if pim!=None:
|
|
nim.paste(pim.crop((0,pim.size[1]-expand,pim.size[0],pim.size[1])),(expand,0))
|
|
|
|
pim = loadImage(filenameBase,x,y+1)
|
|
if pim!=None:
|
|
nim.paste(pim.crop((0,0,pim.size[0],expand)),(expand,nim.size[1]-expand))
|
|
|
|
pim = loadImage(filenameBase,x-1,y)
|
|
if pim!=None:
|
|
nim.paste(pim.crop((pim.size[0]-expand,0,pim.size[0],pim.size[1])),(0,expand))
|
|
|
|
pim = loadImage(filenameBase,x+1,y)
|
|
if pim!=None:
|
|
nim.paste(pim.crop((0,0,expand,pim.size[1])),(nim.size[0]-expand,expand))
|
|
|
|
rsize = im.size
|
|
im = nim
|
|
stride,asize,astc = astc_conv.convert(im,fmt)
|
|
if len(astc)>0:
|
|
hasImages = True
|
|
fileinfo = {}
|
|
fileinfo['size'] = im.size
|
|
fileinfo['bounds'] = [xc+x*rsize[0]*xp-xp*expand,yc+y*rsize[1]*yp-yp*expand,xc+(x+1)*rsize[0]*xp+xp*expand,yc+(y+1)*rsize[1]*yp+yp*expand]
|
|
fileinfo['x'] = x
|
|
fileinfo['y'] = y
|
|
fileinfo['address'] = position
|
|
fileinfo['image_stride'] = stride
|
|
fileinfo['image_size'] = len(astc)
|
|
fileinfo['image_fmt'] = fmt
|
|
o.write(astc)
|
|
with open(filename+'.bin','wb') as f:
|
|
f.write(astc)
|
|
position += len(astc)
|
|
pad(o,64)
|
|
position += 64
|
|
position += alignFile(o,position,64)
|
|
zitem['images'].append(fileinfo)
|
|
if hasImages==True:
|
|
tmeta['tile_matrix'].append(zitem)
|
|
alignFile(o,position,4096)
|
|
with io.open(output+'.json', 'w', encoding='utf-8') as f:
|
|
f.write(json.dumps(tmeta, indent=4))
|
|
|
|
|
|
|
|
|
|
main() |