Skip to content

Instantly share code, notes, and snippets.

@Aareon
Last active November 29, 2017 19:58
Show Gist options
  • Select an option

  • Save Aareon/1b592e1e37adc61c52aa80792a4ba88f to your computer and use it in GitHub Desktop.

Select an option

Save Aareon/1b592e1e37adc61c52aa80792a4ba88f to your computer and use it in GitHub Desktop.
import os
import sys
import imagehash
from PIL import Image, ImageDraw
import pygame
pygame.init()
class Tiler:
def __init__(self, imageName, tile_size):
self.imageName = imageName
self.spritesheet = Image.open(os.getcwd() + "\\" + imageName)
self.tile_size = tile_size
screen_w = self.spritesheet.size[0]
screen_h = self.spritesheet.size[1]
self.screen = pygame.display.set_mode((screen_w, screen_h))
self.clock = pygame.time.Clock()
pygame.display.set_caption(imageName + " - tilemap (Press any key to begin!)")
def getPos(self, tileX, tileY):
posX = self.tile_size * tileX
posY = self.tile_size * tileY
return (posX, posY)
def getTile(self, tileX, tileY):
posX, posY = self.getPos(tileX, tileY)
box = (posX, posY, posX + self.tile_size, posY + self.tile_size)
return self.spritesheet.crop(box)
def run(self, x=0, y=0):
while True:
# Pygame events
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit(0)
elif event.type == pygame.KEYUP:
self.main(x, y)
def main(self, x, y):
size = self.spritesheet.size
signatures = []
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit(0)
pos = self.getPos(x, y)
if pos[0] > size[0]:
x = 0
y += 1
elif pos[1] > size[1]:
break
else:
tile = self.getTile(x, y)
signature = imagehash.average_hash(tile)
if signature not in signatures:
tile.save("out/{}_{}.png".format(x, y))
self.draw_image(x, y, tile)
signatures.append(signature)
x += 1
del tile
del signatures
self.done()
def draw_image(self, x, y, tile):
image = ImageDraw.Draw(tile)
data = tile.tobytes()
sprite = pygame.image.fromstring(data, tile.size, tile.mode)
self.screen.blit(sprite, (x*self.tile_size, y*self.tile_size))
pygame.display.update()
self.clock.tick(60)
def done(self):
pygame.display.set_caption(self.imageName + " - tilemap (Done!)")
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit(0)
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
sys.exit(0)
# Tested with:
# https://cdn.discordapp.com/attachments/373286097133764618/384870661908070400/pallettown.png
tiler = Tiler("pallettown.png", 16)
tiler.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment