该python
程序用来将纹理制作成rimworld风格的墙砖。分为两步:
- 生成二角二边图块集。便于调整细节。
- 生成类似下图的瓦片砖块。
你可以在软件中按这里的红色制作terrain_set。
更多的操作详见帖子:https://tieba.baidu.com/p/9086694101。
from PIL import Image, ImageDraw, ImageEnhance
def load_png(path):
return Image.open(path).convert('RGBA')
def is_point_in_polygon(x, y, points):
"""
使用奇偶规则判断点是否在多边形内部。
:param x: 点的x坐标。
:param y: 点的y坐标。
:param points: 多边形顶点的列表,格式为[(x1, y1), (x2, y2), ...]。
:return: 如果点在多边形内部返回True,否则返回False。
"""
n = len(points)
inside = False
p1x, p1y = points[0]
for i in range(n):
p2x, p2y = points[i + 1] if i < n - 1 else points[0]
if (y > min(p1y, p2y)) and (y <= max(p1y, p2y)):
if x <= max(p1x, p2x):
if p1y != p2y:
xinters = (y - p1y) * (p2x - p1x) / (p2y - p1y) + p1x
if p1x == p2x or x <= xinters:
inside = not inside
p1x, p1y = p2x, p2y
return inside
def replace_pixels_in_polygon(image1, image2, points, displacement):
"""
替换位于多边形内部的像素。
:param image_path: 原始图片的路径。
:param points: 多边形顶点的列表,格式为[(x1, y1), (x2, y2), ...]。
:param replace_func: 一个函数,接受当前像素颜色并返回新颜色。
"""
dx, dy = displacement
pixels1 = image1.load()
pixels2 = image2.load()
width2, height2 = image2.size
for x in range(width2):
for y in range(height2):
if is_point_in_polygon(x, y, points):
pixels1[dx + x, dy + y] = pixels2[x, y]
return image1
def replace_pixels_in_polygon_without_plotting_edge(image1, image2, angle, points, displacement, resize_pixels, light_ratio):
image2 = image2.rotate(angle).resize(resize_pixels)
image2 = ImageEnhance.Brightness(image2).enhance(light_ratio)
image1 = replace_pixels_in_polygon(image1, image2, points, displacement)
return image1
def plot_inner_brick():
img_ori = load_png(PATH_PATTERN)
new_img = img_ori.copy()
new_img = ImageEnhance.Brightness(new_img).enhance(TOP_LIGHT_STRENGTH)
# 左侧三角形
new_img = replace_pixels_in_polygon_without_plotting_edge(
new_img, img_ori, 270,
[(-1, TILE_SIZE//2 - PIXEL_D - 1), (-1, TILE_SIZE//2 + PIXEL_U), (PIXEL_S, TILE_SIZE//2)],
(TILE_SIZE//2 - PIXEL_S, 0),
(PIXEL_S, TILE_SIZE), 1
)
# 右侧三角形
new_img = replace_pixels_in_polygon_without_plotting_edge(
new_img, img_ori, 90,
[(PIXEL_S, TILE_SIZE//2 + PIXEL_U), (PIXEL_S, TILE_SIZE//2 - PIXEL_D - 1), (-1, TILE_SIZE//2)],
(TILE_SIZE//2, 0),
(PIXEL_S, TILE_SIZE), 1
)
# 背面三角形
new_img = replace_pixels_in_polygon_without_plotting_edge(
new_img, img_ori, 0,
[(TILE_SIZE//2, -1), (TILE_SIZE//2 - PIXEL_S - 1, PIXEL_U), (TILE_SIZE//2 + PIXEL_S, PIXEL_U)],
(0, TILE_SIZE//2),
(TILE_SIZE, PIXEL_U), BACK_LIGHT_STRENGTH
)
# 正面三角形
new_img = replace_pixels_in_polygon_without_plotting_edge(
new_img, img_ori, 180,
[(TILE_SIZE//2 - PIXEL_S - 1, -1), (TILE_SIZE//2-1, PIXEL_D), (TILE_SIZE//2, PIXEL_D), (TILE_SIZE//2 + PIXEL_S, -1)],
(0, TILE_SIZE//2 - PIXEL_D),
(TILE_SIZE, PIXEL_D), FRONT_LIGHT_STRENGTH
)
return new_img
def plot_outer_brick():
img_ori = load_png(PATH_PATTERN)
new_img = img_ori.copy()
new_img = ImageEnhance.Brightness(new_img).enhance(TOP_LIGHT_STRENGTH)
# 左侧梯形
new_img = replace_pixels_in_polygon_without_plotting_edge(
new_img, img_ori, 90,
[(-1, -1), (-1, TILE_SIZE), (PIXEL_S, PIXEL_U + PIXEL_TOP), (PIXEL_S, PIXEL_U-1)],
(0, 0),
(PIXEL_S, TILE_SIZE), 1
)
# 右侧梯形
new_img = replace_pixels_in_polygon_without_plotting_edge(
new_img, img_ori, 270,
[(PIXEL_S-1, -1), (-1, PIXEL_U - 1), (-1, PIXEL_U + PIXEL_TOP), (PIXEL_S, TILE_SIZE)],
(PIXEL_S + PIXEL_TOP, 0),
(PIXEL_S, TILE_SIZE), 1
)
# 背面梯形
new_img = replace_pixels_in_polygon_without_plotting_edge(
new_img, img_ori, 180,
[(-1, -1), (PIXEL_S - 1, PIXEL_U), (TILE_SIZE - PIXEL_S, PIXEL_U), (TILE_SIZE, -1)],
(0, 0),
(TILE_SIZE, PIXEL_U), BACK_LIGHT_STRENGTH
)
# 正面梯形
new_img = replace_pixels_in_polygon_without_plotting_edge(
new_img, img_ori, 0,
[(PIXEL_S - 1, -1), (-1, PIXEL_D-1), (TILE_SIZE, PIXEL_D-1), (TILE_SIZE - PIXEL_S, 0)],
(0, TILE_SIZE - PIXEL_D),
(TILE_SIZE, PIXEL_D), FRONT_LIGHT_STRENGTH
)
return new_img
def load_png_left_up(img):
"""加载图片左上角1/4区域"""
return img.crop((0, 0, img.width // 2, img.height // 2))
def load_png_right_up(img):
"""加载图片右上角1/4区域"""
return img.crop((img.width // 2, 0, img.width, img.height // 2))
def load_png_left_down(img):
"""加载图片左下角1/4区域"""
return img.crop((0, img.height // 2, img.width // 2, img.height))
def load_png_right_down(img):
"""加载图片右下角1/4区域"""
return img.crop((img.width // 2, img.height // 2, img.width, img.height))
def pattern_to_edge_map():
new_img = Image.new('RGBA', (5 * TILE_SIZE, 3 * TILE_SIZE))
ori_img = load_png(PATH_PATTERN)
for i in range(5):
for j in range(3):
new_img.paste(ori_img, (i * TILE_SIZE, j * TILE_SIZE))
new_img = ImageEnhance.Brightness(new_img).enhance(TOP_LIGHT_STRENGTH)
# 画内外图
img_outer_corner = plot_outer_brick()
img_inner_corner = plot_inner_brick()
# 添加外角
img_lu = load_png_left_up(img_outer_corner)
img_ld = load_png_left_down(img_outer_corner)
img_ru = load_png_right_up(img_outer_corner)
img_rd = load_png_right_down(img_outer_corner)
new_img.paste(img_lu, (0, 0))
new_img.paste(img_ld, (0, 5 * TILE_SIZE//2))
new_img.paste(img_ru, (5 * TILE_SIZE//2, 0))
new_img.paste(img_rd, (5 * TILE_SIZE//2, 5 * TILE_SIZE//2))
# 添加内角
img_lu = load_png_left_up(img_inner_corner)
img_ld = load_png_left_down(img_inner_corner)
img_ru = load_png_right_up(img_inner_corner)
img_rd = load_png_right_down(img_inner_corner)
new_img.paste(img_lu, (7 * TILE_SIZE//2, TILE_SIZE//2))
new_img.paste(img_ru, (8 * TILE_SIZE//2, TILE_SIZE//2))
new_img.paste(img_lu, (7 * TILE_SIZE//2, 5 * TILE_SIZE//2))
new_img.paste(img_ru, (8 * TILE_SIZE//2, 5 * TILE_SIZE//2))
new_img.paste(img_ld, (7 * TILE_SIZE//2, 2 * TILE_SIZE//2))
new_img.paste(img_rd, (8 * TILE_SIZE//2, 2 * TILE_SIZE//2))
new_img.paste(img_ld, (9 * TILE_SIZE//2, 4 * TILE_SIZE//2))
new_img.paste(img_rd, (6 * TILE_SIZE//2, 4 * TILE_SIZE//2))
# 加边
new_img = replace_pixels_in_polygon_without_plotting_edge(
new_img, ori_img, 0,
[(-1, -1), (-1, PIXEL_D), (TILE_SIZE, PIXEL_D), (TILE_SIZE, -1)],
(0.5 * TILE_SIZE, 3 * TILE_SIZE - PIXEL_D),
(TILE_SIZE, PIXEL_D), FRONT_LIGHT_STRENGTH)
new_img = replace_pixels_in_polygon_without_plotting_edge(
new_img, ori_img, 0,
[(-1, -1), (-1, PIXEL_D), (TILE_SIZE, PIXEL_D), (TILE_SIZE, -1)],
(1.5 * TILE_SIZE, 3 * TILE_SIZE - PIXEL_D),
(TILE_SIZE, PIXEL_D), FRONT_LIGHT_STRENGTH)
new_img = replace_pixels_in_polygon_without_plotting_edge(
new_img, ori_img, 180,
[(-1, -1), (-1, PIXEL_U), (TILE_SIZE, PIXEL_U), (TILE_SIZE, -1)],
(0.5 * TILE_SIZE, 0),
(TILE_SIZE, PIXEL_U), BACK_LIGHT_STRENGTH)
new_img = replace_pixels_in_polygon_without_plotting_edge(
new_img, ori_img, 180,
[(-1, -1), (-1, PIXEL_U), (TILE_SIZE, PIXEL_U), (TILE_SIZE, -1)],
(1.5 * TILE_SIZE, 0),
(TILE_SIZE, PIXEL_U), BACK_LIGHT_STRENGTH)
new_img = replace_pixels_in_polygon_without_plotting_edge(
new_img, ori_img, 90,
[(-1, -1), (-1, TILE_SIZE), (PIXEL_S, TILE_SIZE), (PIXEL_S, -1)],
(0, 0.5 * TILE_SIZE),
(PIXEL_S, TILE_SIZE), 1)
new_img = replace_pixels_in_polygon_without_plotting_edge(
new_img, ori_img, 90,
[(-1, -1), (-1, TILE_SIZE), (PIXEL_S, TILE_SIZE), (PIXEL_S, -1)],
(0, 1.5 * TILE_SIZE),
(PIXEL_S, TILE_SIZE), 1)
new_img = replace_pixels_in_polygon_without_plotting_edge(
new_img, ori_img, 270,
[(-1, -1), (-1, TILE_SIZE), (PIXEL_S, TILE_SIZE), (PIXEL_S, -1)],
(3 * TILE_SIZE - PIXEL_S, 0.5 * TILE_SIZE),
(PIXEL_S, TILE_SIZE), 1)
new_img = replace_pixels_in_polygon_without_plotting_edge(
new_img, ori_img, 270,
[(-1, -1), (-1, TILE_SIZE), (PIXEL_S, TILE_SIZE), (PIXEL_S, -1)],
(3 * TILE_SIZE - PIXEL_S, 1.5 * TILE_SIZE),
(PIXEL_S, TILE_SIZE), 1)
return new_img
def edge_map_to_tile_map(path_edge_map):
new_img = Image.new('RGBA', (12 * TILE_SIZE, 4 * TILE_SIZE))
HALF_TILE_SIZE = TILE_SIZE // 2
# 左上外角
img_lu = load_png(path_edge_map).crop((0, 0, HALF_TILE_SIZE, HALF_TILE_SIZE))
new_img.paste(img_lu, (0, 0))
new_img.paste(img_lu, (0, 3 * TILE_SIZE))
new_img.paste(img_lu, (TILE_SIZE, 0))
new_img.paste(img_lu, (TILE_SIZE, 3 * TILE_SIZE))
new_img.paste(img_lu, (8 * TILE_SIZE, 0))
# 右上外角
img_ru = load_png(path_edge_map).crop((5 * HALF_TILE_SIZE, 0, 6 * HALF_TILE_SIZE, HALF_TILE_SIZE))
new_img.paste(img_ru, (HALF_TILE_SIZE, 0))
new_img.paste(img_ru, (HALF_TILE_SIZE, 3 * TILE_SIZE))
new_img.paste(img_ru, (7 * HALF_TILE_SIZE, 0))
new_img.paste(img_ru, (7 * HALF_TILE_SIZE, 3 * TILE_SIZE))
new_img.paste(img_ru, (23 * HALF_TILE_SIZE, 0))
# 左下外角
img_ld = load_png(path_edge_map).crop((0, 5 * HALF_TILE_SIZE, HALF_TILE_SIZE, 6 * HALF_TILE_SIZE))
new_img.paste(img_ld, (0, 5 * HALF_TILE_SIZE))
new_img.paste(img_ld, (0, 7 * HALF_TILE_SIZE))
new_img.paste(img_ld, (TILE_SIZE, 5 * HALF_TILE_SIZE))
new_img.paste(img_ld, (TILE_SIZE, 7 * HALF_TILE_SIZE))
new_img.paste(img_ld, (8 * TILE_SIZE, 7 * HALF_TILE_SIZE))
# 右下外角
img_rd = load_png(path_edge_map).crop((5 * HALF_TILE_SIZE, 5 * HALF_TILE_SIZE, 6 * HALF_TILE_SIZE, 6 * HALF_TILE_SIZE))
new_img.paste(img_rd, (HALF_TILE_SIZE, 5 * HALF_TILE_SIZE))
new_img.paste(img_rd, (HALF_TILE_SIZE, 7 * HALF_TILE_SIZE))
new_img.paste(img_rd, (7 * HALF_TILE_SIZE, 5 * HALF_TILE_SIZE))
new_img.paste(img_rd, (7 * HALF_TILE_SIZE, 7 * HALF_TILE_SIZE))
new_img.paste(img_rd, (23 * HALF_TILE_SIZE, 7 * HALF_TILE_SIZE))
# 完整左边
img_l = load_png(path_edge_map).crop((0, 2 * HALF_TILE_SIZE, HALF_TILE_SIZE, 4 * HALF_TILE_SIZE))
new_img.paste(img_l, (0, 2 * HALF_TILE_SIZE))
new_img.paste(img_l, (2 * HALF_TILE_SIZE, 2 * HALF_TILE_SIZE))
new_img.paste(img_l, (8 * HALF_TILE_SIZE, 2 * HALF_TILE_SIZE))
new_img.paste(img_l, (8 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE))
new_img.paste(img_l, (16 * HALF_TILE_SIZE, 2 * HALF_TILE_SIZE))
# 完整右边
img_r = load_png(path_edge_map).crop((5 * HALF_TILE_SIZE, 2 * HALF_TILE_SIZE, 6 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE))
new_img.paste(img_r, (1 * HALF_TILE_SIZE, 2 * HALF_TILE_SIZE))
new_img.paste(img_r, (7 * HALF_TILE_SIZE, 2 * HALF_TILE_SIZE))
new_img.paste(img_r, (15 * HALF_TILE_SIZE, 2 * HALF_TILE_SIZE))
new_img.paste(img_r, (15 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE))
new_img.paste(img_r, (23 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE))
# 左下边
img_ld = load_png(path_edge_map).crop((0, HALF_TILE_SIZE, HALF_TILE_SIZE, 2 * HALF_TILE_SIZE))
new_img.paste(img_ld, (0, 1 * HALF_TILE_SIZE))
new_img.paste(img_ld, (2 * HALF_TILE_SIZE, 1 * HALF_TILE_SIZE))
new_img.paste(img_ld, (16 * HALF_TILE_SIZE, 1 * HALF_TILE_SIZE))
# 右下边
img_rd = load_png(path_edge_map).crop((5 * HALF_TILE_SIZE, HALF_TILE_SIZE, 6 * HALF_TILE_SIZE, 2 * HALF_TILE_SIZE))
new_img.paste(img_rd, (1 * HALF_TILE_SIZE, 1 * HALF_TILE_SIZE))
new_img.paste(img_rd, (7 * HALF_TILE_SIZE, 1 * HALF_TILE_SIZE))
new_img.paste(img_rd, (23 * HALF_TILE_SIZE, 1 * HALF_TILE_SIZE))
# 左上边
img_lu = load_png(path_edge_map).crop((0, 4 * HALF_TILE_SIZE, HALF_TILE_SIZE, 5 * HALF_TILE_SIZE))
new_img.paste(img_lu, (0, 4 * HALF_TILE_SIZE))
new_img.paste(img_lu, (2 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE))
new_img.paste(img_lu, (16 * HALF_TILE_SIZE, 6 * HALF_TILE_SIZE))
# 右上边
img_ru = load_png(path_edge_map).crop((5 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE, 6 * HALF_TILE_SIZE, 5 * HALF_TILE_SIZE))
new_img.paste(img_ru, (1 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE))
new_img.paste(img_ru, (7 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE))
new_img.paste(img_ru, (23 * HALF_TILE_SIZE, 6 * HALF_TILE_SIZE))
# 左上内角
img_lu = load_png(path_edge_map).crop((8 * HALF_TILE_SIZE, 2 * HALF_TILE_SIZE, 9 * HALF_TILE_SIZE, 3 * HALF_TILE_SIZE))
new_img.paste(img_lu, (4 * HALF_TILE_SIZE, 2 * HALF_TILE_SIZE))
new_img.paste(img_lu, (4 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE))
new_img.paste(img_lu, (6 * HALF_TILE_SIZE, 2 * HALF_TILE_SIZE))
new_img.paste(img_lu, (6 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE))
new_img.paste(img_lu, (8 * HALF_TILE_SIZE, 6 * HALF_TILE_SIZE))
new_img.paste(img_lu, (10 * HALF_TILE_SIZE, 6 * HALF_TILE_SIZE))
new_img.paste(img_lu, (14 * HALF_TILE_SIZE, 6 * HALF_TILE_SIZE))
new_img.paste(img_lu, (10 * HALF_TILE_SIZE, 2 * HALF_TILE_SIZE))
new_img.paste(img_lu, (14 * HALF_TILE_SIZE, 2 * HALF_TILE_SIZE))
new_img.paste(img_lu, (14 * HALF_TILE_SIZE, 0 * HALF_TILE_SIZE))
new_img.paste(img_lu, (16 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE))
new_img.paste(img_lu, (18 * HALF_TILE_SIZE, 0 * HALF_TILE_SIZE))
new_img.paste(img_lu, (18 * HALF_TILE_SIZE, 2 * HALF_TILE_SIZE))
# 右上内角
img_ru = load_png(path_edge_map).crop((7 * HALF_TILE_SIZE, 2 * HALF_TILE_SIZE, 8 * HALF_TILE_SIZE, 3 * HALF_TILE_SIZE))
new_img.paste(img_ru, (3 * HALF_TILE_SIZE, 2 * HALF_TILE_SIZE))
new_img.paste(img_ru, (5 * HALF_TILE_SIZE, 2 * HALF_TILE_SIZE))
new_img.paste(img_ru, (3 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE))
new_img.paste(img_ru, (5 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE))
new_img.paste(img_ru, (9 * HALF_TILE_SIZE, 0 * HALF_TILE_SIZE))
new_img.paste(img_ru, (9 * HALF_TILE_SIZE, 2 * HALF_TILE_SIZE))
new_img.paste(img_ru, (9 * HALF_TILE_SIZE, 6 * HALF_TILE_SIZE))
new_img.paste(img_ru, (13 * HALF_TILE_SIZE, 2 * HALF_TILE_SIZE))
new_img.paste(img_ru, (13 * HALF_TILE_SIZE, 6 * HALF_TILE_SIZE))
new_img.paste(img_ru, (15 * HALF_TILE_SIZE, 6 * HALF_TILE_SIZE))
new_img.paste(img_ru, (19 * HALF_TILE_SIZE, 0 * HALF_TILE_SIZE))
new_img.paste(img_ru, (21 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE))
new_img.paste(img_ru, (23 * HALF_TILE_SIZE, 2 * HALF_TILE_SIZE))
# 左下内角
img_ld = load_png(path_edge_map).crop((8 * HALF_TILE_SIZE, 1 * HALF_TILE_SIZE, 9 * HALF_TILE_SIZE, 2 * HALF_TILE_SIZE))
new_img.paste(img_ld, (4 * HALF_TILE_SIZE, 1 * HALF_TILE_SIZE))
new_img.paste(img_ld, (4 * HALF_TILE_SIZE, 3 * HALF_TILE_SIZE))
new_img.paste(img_ld, (6 * HALF_TILE_SIZE, 1 * HALF_TILE_SIZE))
new_img.paste(img_ld, (6 * HALF_TILE_SIZE, 3 * HALF_TILE_SIZE))
new_img.paste(img_ld, (8 * HALF_TILE_SIZE, 1 * HALF_TILE_SIZE))
new_img.paste(img_ld, (10 * HALF_TILE_SIZE, 1 * HALF_TILE_SIZE))
new_img.paste(img_ld, (10 * HALF_TILE_SIZE, 5 * HALF_TILE_SIZE))
new_img.paste(img_ld, (14 * HALF_TILE_SIZE, 1 * HALF_TILE_SIZE))
new_img.paste(img_ld, (14 * HALF_TILE_SIZE, 5 * HALF_TILE_SIZE))
new_img.paste(img_ld, (14 * HALF_TILE_SIZE, 7 * HALF_TILE_SIZE))
new_img.paste(img_ld, (16 * HALF_TILE_SIZE, 5 * HALF_TILE_SIZE))
new_img.paste(img_ld, (20 * HALF_TILE_SIZE, 5 * HALF_TILE_SIZE))
new_img.paste(img_ld, (20 * HALF_TILE_SIZE, 7 * HALF_TILE_SIZE))
# 右下内角
img_rd = load_png(path_edge_map).crop((7 * HALF_TILE_SIZE, 1 * HALF_TILE_SIZE, 8 * HALF_TILE_SIZE, 2 * HALF_TILE_SIZE))
new_img.paste(img_rd, (3 * HALF_TILE_SIZE, 1 * HALF_TILE_SIZE))
new_img.paste(img_rd, (3 * HALF_TILE_SIZE, 3 * HALF_TILE_SIZE))
new_img.paste(img_rd, (5 * HALF_TILE_SIZE, 1 * HALF_TILE_SIZE))
new_img.paste(img_rd, (5 * HALF_TILE_SIZE, 3 * HALF_TILE_SIZE))
new_img.paste(img_rd, (9 * HALF_TILE_SIZE, 1 * HALF_TILE_SIZE))
new_img.paste(img_rd, (9 * HALF_TILE_SIZE, 5 * HALF_TILE_SIZE))
new_img.paste(img_rd, (9 * HALF_TILE_SIZE, 7 * HALF_TILE_SIZE))
new_img.paste(img_rd, (13 * HALF_TILE_SIZE, 1 * HALF_TILE_SIZE))
new_img.paste(img_rd, (13 * HALF_TILE_SIZE, 5 * HALF_TILE_SIZE))
new_img.paste(img_rd, (15 * HALF_TILE_SIZE, 1 * HALF_TILE_SIZE))
new_img.paste(img_rd, (19 * HALF_TILE_SIZE, 3 * HALF_TILE_SIZE))
new_img.paste(img_rd, (21 * HALF_TILE_SIZE, 7 * HALF_TILE_SIZE))
new_img.paste(img_rd, (23 * HALF_TILE_SIZE, 3 * HALF_TILE_SIZE))
# 完整上边
img_u = load_png(path_edge_map).crop((2 * HALF_TILE_SIZE, 0 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE, 1 * HALF_TILE_SIZE))
new_img.paste(img_u, (4 * HALF_TILE_SIZE, 0 * HALF_TILE_SIZE))
new_img.paste(img_u, (4 * HALF_TILE_SIZE, 6 * HALF_TILE_SIZE))
new_img.paste(img_u, (10 * HALF_TILE_SIZE, 0 * HALF_TILE_SIZE))
new_img.paste(img_u, (12 * HALF_TILE_SIZE, 0 * HALF_TILE_SIZE))
new_img.paste(img_u, (20 * HALF_TILE_SIZE, 0 * HALF_TILE_SIZE))
# 完整下边
img_d = load_png(path_edge_map).crop((2 * HALF_TILE_SIZE, 5 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE, 6 * HALF_TILE_SIZE))
new_img.paste(img_d, (4 * HALF_TILE_SIZE, 5 * HALF_TILE_SIZE))
new_img.paste(img_d, (4 * HALF_TILE_SIZE, 7 * HALF_TILE_SIZE))
new_img.paste(img_d, (10 * HALF_TILE_SIZE, 7 * HALF_TILE_SIZE))
new_img.paste(img_d, (12 * HALF_TILE_SIZE, 7 * HALF_TILE_SIZE))
new_img.paste(img_d, (18 * HALF_TILE_SIZE, 7 * HALF_TILE_SIZE))
# 完整上左边
img_lu = load_png(path_edge_map).crop((2 * HALF_TILE_SIZE, 0 * HALF_TILE_SIZE, 3 * HALF_TILE_SIZE, 1 * HALF_TILE_SIZE))
new_img.paste(img_lu, (6 * HALF_TILE_SIZE, 0 * HALF_TILE_SIZE))
new_img.paste(img_lu, (6 * HALF_TILE_SIZE, 6 * HALF_TILE_SIZE))
new_img.paste(img_lu, (22 * HALF_TILE_SIZE, 0 * HALF_TILE_SIZE))
# 完整上右边
img_ru = load_png(path_edge_map).crop((3 * HALF_TILE_SIZE, 0 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE, 1 * HALF_TILE_SIZE))
new_img.paste(img_ru, (3 * HALF_TILE_SIZE, 0 * HALF_TILE_SIZE))
new_img.paste(img_ru, (3 * HALF_TILE_SIZE, 6 * HALF_TILE_SIZE))
new_img.paste(img_ru, (17 * HALF_TILE_SIZE, 0 * HALF_TILE_SIZE))
# 完整下左边
img_ld = load_png(path_edge_map).crop((2 * HALF_TILE_SIZE, 5 * HALF_TILE_SIZE, 3 * HALF_TILE_SIZE, 6 * HALF_TILE_SIZE))
new_img.paste(img_ld, (6 * HALF_TILE_SIZE, 5 * HALF_TILE_SIZE))
new_img.paste(img_ld, (6 * HALF_TILE_SIZE, 7 * HALF_TILE_SIZE))
new_img.paste(img_ld, (22 * HALF_TILE_SIZE, 7 * HALF_TILE_SIZE))
# 完整下右边
img_rd = load_png(path_edge_map).crop((3 * HALF_TILE_SIZE, 5 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE, 6 * HALF_TILE_SIZE))
new_img.paste(img_rd, (3 * HALF_TILE_SIZE, 5 * HALF_TILE_SIZE))
new_img.paste(img_rd, (3 * HALF_TILE_SIZE, 7 * HALF_TILE_SIZE))
new_img.paste(img_rd, (17 * HALF_TILE_SIZE, 7 * HALF_TILE_SIZE))
# 完整左上角
img_lu = load_png(path_edge_map).crop((TILE_SIZE, TILE_SIZE, 3 * HALF_TILE_SIZE, 3 * HALF_TILE_SIZE))
new_img.paste(img_lu, (8 * HALF_TILE_SIZE, 0 * HALF_TILE_SIZE))
new_img.paste(img_lu, (10 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE))
new_img.paste(img_lu, (12 * HALF_TILE_SIZE, 2 * HALF_TILE_SIZE))
new_img.paste(img_lu, (12 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE))
new_img.paste(img_lu, (12 * HALF_TILE_SIZE, 6 * HALF_TILE_SIZE))
new_img.paste(img_lu, (14 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE))
new_img.paste(img_lu, (18 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE))
new_img.paste(img_lu, (18 * HALF_TILE_SIZE, 6 * HALF_TILE_SIZE))
new_img.paste(img_lu, (20 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE))
new_img.paste(img_lu, (20 * HALF_TILE_SIZE, 6 * HALF_TILE_SIZE))
new_img.paste(img_lu, (22 * HALF_TILE_SIZE, 6 * HALF_TILE_SIZE))
new_img.paste(img_lu, (22 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE))
new_img.paste(img_lu, (22 * HALF_TILE_SIZE, 2 * HALF_TILE_SIZE))
# 完整左下角
img_ld = load_png(path_edge_map).crop((2 * HALF_TILE_SIZE, 3 * HALF_TILE_SIZE, 3 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE))
new_img.paste(img_ld, (8 * HALF_TILE_SIZE, 7 * HALF_TILE_SIZE))
new_img.paste(img_ld, (10 * HALF_TILE_SIZE, 3 * HALF_TILE_SIZE))
new_img.paste(img_ld, (12 * HALF_TILE_SIZE, 1 * HALF_TILE_SIZE))
new_img.paste(img_ld, (12 * HALF_TILE_SIZE, 3 * HALF_TILE_SIZE))
new_img.paste(img_ld, (12 * HALF_TILE_SIZE, 5 * HALF_TILE_SIZE))
new_img.paste(img_ld, (14 * HALF_TILE_SIZE, 3 * HALF_TILE_SIZE))
new_img.paste(img_ld, (18 * HALF_TILE_SIZE, 1 * HALF_TILE_SIZE))
new_img.paste(img_ld, (18 * HALF_TILE_SIZE, 3 * HALF_TILE_SIZE))
new_img.paste(img_ld, (18 * HALF_TILE_SIZE, 5 * HALF_TILE_SIZE))
new_img.paste(img_ld, (20 * HALF_TILE_SIZE, 1 * HALF_TILE_SIZE))
new_img.paste(img_ld, (22 * HALF_TILE_SIZE, 1 * HALF_TILE_SIZE))
new_img.paste(img_ld, (22 * HALF_TILE_SIZE, 3 * HALF_TILE_SIZE))
new_img.paste(img_ld, (22 * HALF_TILE_SIZE, 5 * HALF_TILE_SIZE))
# 完整右上角
img_ru = load_png(path_edge_map).crop((3 * HALF_TILE_SIZE, 2 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE, 3 * HALF_TILE_SIZE))
new_img.paste(img_ru, (9 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE))
new_img.paste(img_ru, (11 * HALF_TILE_SIZE, 2 * HALF_TILE_SIZE))
new_img.paste(img_ru, (11 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE))
new_img.paste(img_ru, (11 * HALF_TILE_SIZE, 6 * HALF_TILE_SIZE))
new_img.paste(img_ru, (13 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE))
new_img.paste(img_ru, (15 * HALF_TILE_SIZE, 0 * HALF_TILE_SIZE))
new_img.paste(img_ru, (17 * HALF_TILE_SIZE, 2 * HALF_TILE_SIZE))
new_img.paste(img_ru, (17 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE))
new_img.paste(img_ru, (17 * HALF_TILE_SIZE, 6 * HALF_TILE_SIZE))
new_img.paste(img_ru, (19 * HALF_TILE_SIZE, 2 * HALF_TILE_SIZE))
new_img.paste(img_ru, (19 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE))
new_img.paste(img_ru, (19 * HALF_TILE_SIZE, 6 * HALF_TILE_SIZE))
new_img.paste(img_ru, (21 * HALF_TILE_SIZE, 6 * HALF_TILE_SIZE))
# 完整右下角
img_rd = load_png(path_edge_map).crop((3 * HALF_TILE_SIZE, 3 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE, 4 * HALF_TILE_SIZE))
new_img.paste(img_rd, (9 * HALF_TILE_SIZE, 3 * HALF_TILE_SIZE))
new_img.paste(img_rd, (11 * HALF_TILE_SIZE, 1 * HALF_TILE_SIZE))
new_img.paste(img_rd, (11 * HALF_TILE_SIZE, 3 * HALF_TILE_SIZE))
new_img.paste(img_rd, (11 * HALF_TILE_SIZE, 5 * HALF_TILE_SIZE))
new_img.paste(img_rd, (13 * HALF_TILE_SIZE, 3 * HALF_TILE_SIZE))
new_img.paste(img_rd, (15 * HALF_TILE_SIZE, 7 * HALF_TILE_SIZE))
new_img.paste(img_rd, (17 * HALF_TILE_SIZE, 1 * HALF_TILE_SIZE))
new_img.paste(img_rd, (17 * HALF_TILE_SIZE, 3 * HALF_TILE_SIZE))
new_img.paste(img_rd, (17 * HALF_TILE_SIZE, 5 * HALF_TILE_SIZE))
new_img.paste(img_rd, (19 * HALF_TILE_SIZE, 1 * HALF_TILE_SIZE))
new_img.paste(img_rd, (19 * HALF_TILE_SIZE, 5 * HALF_TILE_SIZE))
new_img.paste(img_rd, (21 * HALF_TILE_SIZE, 1 * HALF_TILE_SIZE))
new_img.paste(img_rd, (21 * HALF_TILE_SIZE, 5 * HALF_TILE_SIZE))
return new_img
if __name__ == '__main__':
TILE_SIZE = 50
FRONT_LIGHT_STRENGTH = 1.2
BACK_LIGHT_STRENGTH = 0.6
TOP_LIGHT_STRENGTH = 0.8
PATH_PATTERN = "./wall/砖块-图案.png"
PATH_EDGE_MAP = "./wall/二角图-砖块1.png"
PATH_TILE_MAP = "./wall/瓦片-砖块.png"
PIXEL_TOP = 20 # 顶部像素宽度
PIXEL_S = 15
PIXEL_U = 5
PIXEL_D = 25
# 生成二边二角图块
img = pattern_to_edge_map()
img.save(PATH_EDGE_MAP)
# 生成tileset
# img = edge_map_to_tile_map(PATH_EDGE_MAP)
# img.save(PATH_TILE_MAP)