from contextlib import contextmanager import time import json from binpack2 import Packer import numpy as np from PIL import Image import pandas as pd @contextmanager def timing(message='operation'): then = time.time() yield elapsed = time.time() - then print('{} completed in {:.4f}s'.format(message, elapsed)) if __name__ == '__main__': PATH = 'D20170611T205930_IFCB010_roisizes.json' with open(PATH) as fin: roisizes = json.load(fin) roisizes = pd.DataFrame.from_dict(roisizes) roisizes['area'] = roisizes['width'] * roisizes['height'] roisizes = roisizes.sort_values('area', ascending=False) print('loaded {} rectangles'.format(len(roisizes['targetNumber']))) with timing('compilation'): packer = Packer(1000,1000) packer.add_rect(10, 10, 1) done = set() need_more_pages = True page = 0 with timing('run'): while need_more_pages: need_more_pages = False page += 1 out = np.zeros((2048, 2048), dtype=np.uint8) packer = Packer(out.shape[0], out.shape[1]) for t in roisizes.itertuples(): if t.targetNumber in done: continue w, h = t.width, t.height x, y = packer.add_rect(w, h, t.targetNumber) if x != -1 and y != -1: done.add(t.targetNumber) color = ((t.targetNumber * 37) % 127) + 127 out[x:x+w,y:y+h] = color else: need_more_pages = True print('did page {}'.format(page)) Image.fromarray(out).save('page{:02d}.png'.format(page))