45 lines
1.7 KiB
Python
45 lines
1.7 KiB
Python
import math
|
|
from PIL import Image
|
|
|
|
|
|
class ImageAssembler:
|
|
def __init__(self, metadata, atlas: Image, cell_size: int, padding: int):
|
|
self.atlas = atlas
|
|
self.atlas_width_cells = int(atlas.size[0] / cell_size)
|
|
self.atlas_height_cells = int(atlas.size[1] / cell_size)
|
|
|
|
self.cell_size = cell_size
|
|
self.padding = padding
|
|
self.metadata = metadata
|
|
|
|
self.output = Image.new('RGBA', (metadata['width'], metadata['height']), (255, 255, 255, 0))
|
|
|
|
# TODO double check this logic
|
|
self.output_width_cells = 1 + math.ceil(float(metadata['width'] - cell_size) / (cell_size - 2*padding))
|
|
|
|
def atlas_get_cell(self, cell_no: int):
|
|
cell_x_pos = cell_no % self.atlas_width_cells
|
|
cell_y_pos = self.atlas_height_cells - math.floor(cell_no / self.atlas_width_cells) - 1 # From top
|
|
return self.atlas.crop((
|
|
cell_x_pos * self.cell_size,
|
|
cell_y_pos * self.cell_size,
|
|
(cell_x_pos + 1) * self.cell_size,
|
|
(cell_y_pos + 1) * self.cell_size
|
|
))
|
|
|
|
def paint(self):
|
|
for i in range(len(self.metadata['cellIndexList'])):
|
|
source_cell_number = self.metadata['cellIndexList'][i]
|
|
source_cell = self.atlas_get_cell(source_cell_number)
|
|
|
|
output_x_pos = i % self.output_width_cells
|
|
output_y_pos = math.floor(i / self.output_width_cells) # From bottom
|
|
self.output.paste(source_cell, (
|
|
output_x_pos * (self.cell_size - (2*self.padding)),
|
|
self.output.size[1] - self.cell_size - (output_y_pos * (self.cell_size - (2*self.padding)))
|
|
))
|
|
|
|
def get_output(self):
|
|
return self.output
|
|
|