代码将纹理转变成RimWorld风格墙砖

python程序用来将纹理制作成rimworld风格的墙砖。分为两步:

  1. 生成二角二边图块集。便于调整细节。
  2. 生成类似下图的瓦片砖块。
    请添加图片描述
    你可以在软件中按这里的红色制作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)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值