split process and puzzle template wip
parent
4054257698
commit
408a27b05e
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "katamari",
|
|
||||||
"rows": 10,
|
|
||||||
"columns": 15,
|
|
||||||
"width": 1280,
|
|
||||||
"height": 720,
|
|
||||||
"image": "katamari.jpg",
|
|
||||||
"clusters": []
|
|
||||||
}
|
|
@ -0,0 +1,142 @@
|
|||||||
|
import os, json
|
||||||
|
from wand.image import Image
|
||||||
|
from wand.drawing import Drawing
|
||||||
|
from shortuuid import uuid
|
||||||
|
from math import sqrt
|
||||||
|
|
||||||
|
|
||||||
|
def split(image, width, height, pieces):
|
||||||
|
|
||||||
|
image_file = os.path.basename(image)
|
||||||
|
name = os.path.splitext(image_file)[0]
|
||||||
|
output = f"chaospuzzles/puzzles/{name}"
|
||||||
|
|
||||||
|
print(f"Creating the {name} folder")
|
||||||
|
try:
|
||||||
|
os.makedirs(output)
|
||||||
|
os.makedirs(f"{output}/pieces")
|
||||||
|
os.makedirs(f"{output}/clusters")
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
print("Calculating rows and columns... ", end="")
|
||||||
|
piece_side, rows, columns = area_to_pieces(width, height, pieces)
|
||||||
|
print(f"Done!")
|
||||||
|
print(f"{rows * columns} pieces, {rows} rows by {columns} columns")
|
||||||
|
|
||||||
|
print("Splitting in tiles... ", end="")
|
||||||
|
# copy the source image to the puzzles folder and split it into tiles
|
||||||
|
with Image(filename=image) as img:
|
||||||
|
img.save(filename=f"{output}/{image_file}")
|
||||||
|
for y in range(columns):
|
||||||
|
for x in range(rows):
|
||||||
|
x_start = x * piece_side
|
||||||
|
y_start = y * piece_side
|
||||||
|
x_end = x_start + piece_side
|
||||||
|
y_end = y_start + piece_side
|
||||||
|
with img[x_start:x_end, y_start:y_end] as piece:
|
||||||
|
piece.save(filename=f"{output}/pieces/{name}-{x}-{y}.jpg")
|
||||||
|
print("Done!")
|
||||||
|
# create an id for each piece and store it into a pieces.json file and generate the retro image for the puzzle
|
||||||
|
|
||||||
|
print("Calculating the ID for each piece... ", end="")
|
||||||
|
pieces = []
|
||||||
|
with Image(width=width, height=height) as retro:
|
||||||
|
draw = Drawing()
|
||||||
|
draw.font_size = 11
|
||||||
|
draw.text_alignment = "center"
|
||||||
|
|
||||||
|
for x in range(rows):
|
||||||
|
row = []
|
||||||
|
for y in range(columns):
|
||||||
|
|
||||||
|
# generate a random ID for each piece
|
||||||
|
ID = uuid()[:4]
|
||||||
|
|
||||||
|
# write the id in the center of each piece
|
||||||
|
draw.text(
|
||||||
|
int(x * piece_side + piece_side / 2),
|
||||||
|
int(y * piece_side + piece_side / 2),
|
||||||
|
f"{name}\n{ID}",
|
||||||
|
)
|
||||||
|
|
||||||
|
# store the id in the pieces dictionary
|
||||||
|
row.append(ID)
|
||||||
|
pieces.append(row)
|
||||||
|
print("Done!")
|
||||||
|
print("Generating the picture to print behind the puzzle... ", end="")
|
||||||
|
draw(retro)
|
||||||
|
retro.save(filename=f"{output}/{name}_retro.png")
|
||||||
|
print("Done!")
|
||||||
|
|
||||||
|
print("Writing pieces.json ", end="")
|
||||||
|
with open(f"{output}/pieces.json", "w") as file:
|
||||||
|
file.write(json.dumps(pieces))
|
||||||
|
print("Done!")
|
||||||
|
|
||||||
|
print("Writing adjacents.json ", end="")
|
||||||
|
adjacents = {}
|
||||||
|
for x in range(rows):
|
||||||
|
for y in range(columns):
|
||||||
|
current = pieces[x][y]
|
||||||
|
|
||||||
|
if y > 0:
|
||||||
|
n = pieces[x][y - 1]
|
||||||
|
else:
|
||||||
|
n = None
|
||||||
|
|
||||||
|
if y < columns - 1:
|
||||||
|
s = pieces[x][y + 1]
|
||||||
|
else:
|
||||||
|
s = None
|
||||||
|
|
||||||
|
if x > 0:
|
||||||
|
w = pieces[x - 1][y]
|
||||||
|
else:
|
||||||
|
w = None
|
||||||
|
|
||||||
|
if x < rows - 1:
|
||||||
|
e = pieces[x + 1][y]
|
||||||
|
else:
|
||||||
|
e = None
|
||||||
|
|
||||||
|
adjacents[current] = (n, e, s, w)
|
||||||
|
|
||||||
|
with open(f"{output}/adjacents.json", "w") as file:
|
||||||
|
file.write(json.dumps(adjacents))
|
||||||
|
print("Done!")
|
||||||
|
|
||||||
|
# info.json file with all the info about the puzzle
|
||||||
|
print("Writing info.json ", end="")
|
||||||
|
with open(f"{output}/info.json", "w") as file:
|
||||||
|
file.write(
|
||||||
|
json.dumps(
|
||||||
|
{
|
||||||
|
"name": name,
|
||||||
|
"rows": rows,
|
||||||
|
"columns": columns,
|
||||||
|
"width": width,
|
||||||
|
"height": height,
|
||||||
|
"image": image_file,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
print("Done!")
|
||||||
|
|
||||||
|
|
||||||
|
def area_to_pieces(width, height, pieces):
|
||||||
|
area = width * height
|
||||||
|
piece_area = area / pieces
|
||||||
|
piece_side = sqrt(piece_area)
|
||||||
|
pieces_h = int(width / piece_side)
|
||||||
|
pieces_v = int(height / piece_side)
|
||||||
|
return (int(piece_side), pieces_h, pieces_v)
|
||||||
|
|
||||||
|
|
||||||
|
# test
|
||||||
|
split(
|
||||||
|
"chaospuzzles/static/img/katamari.jpg",
|
||||||
|
3368, # width
|
||||||
|
2380, # height
|
||||||
|
500, # pieces
|
||||||
|
)
|
@ -1,34 +0,0 @@
|
|||||||
from wand.image import Image
|
|
||||||
from math import floor
|
|
||||||
import os
|
|
||||||
|
|
||||||
|
|
||||||
def split(image, name, output, width, height, rows, columns):
|
|
||||||
|
|
||||||
try:
|
|
||||||
os.makedirs(output)
|
|
||||||
except OSError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
piece_width = floor(width / columns)
|
|
||||||
piece_height = floor(height / rows)
|
|
||||||
with Image(filename=image) as img:
|
|
||||||
for y in range(0, columns):
|
|
||||||
for x in range(0, rows):
|
|
||||||
x_start = x * piece_width
|
|
||||||
y_start = y * piece_height
|
|
||||||
x_end = x_start + piece_width
|
|
||||||
y_end = y_start + piece_height
|
|
||||||
with img[x_start:x_end, y_start:y_end] as piece:
|
|
||||||
piece.save(filename=f"{output}/{name}-{x}-{y}.jpg")
|
|
||||||
|
|
||||||
|
|
||||||
split(
|
|
||||||
"chaospuzzles/puzzles/katamari/katamari.jpg",
|
|
||||||
"katamari",
|
|
||||||
"chaospuzzles/static/puzzles/katamari/pieces",
|
|
||||||
3368,
|
|
||||||
2380,
|
|
||||||
10,
|
|
||||||
14,
|
|
||||||
)
|
|
@ -0,0 +1,14 @@
|
|||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.puzzle {
|
||||||
|
display: inline-block;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.piece {
|
||||||
|
display: inline-block;
|
||||||
|
background-color: springgreen;
|
||||||
|
margin: 0;
|
||||||
|
}
|
Before Width: | Height: | Size: 482 KiB After Width: | Height: | Size: 482 KiB |
Loading…
Reference in New Issue