Spigot 1.21.1服务器批量图片转Minecraft地图并自动放置至物品框的实现方案及兼容性问询
Spigot 1.21.1服务器批量图片转Minecraft地图并自动放置至物品框的实现方案及兼容性问询
嘿,刚好之前帮朋友折腾过几乎一模一样的需求,适配你的Spigot 1.21.1环境,给你梳理一套落地的方案,连你关心的无插件环境兼容性问题也一起说清楚:
一、所需工具&插件(不用装花里胡哨的,就俩核心)
- 你已经在用的RaspberryJuice和mcpi库:这是Python脚本和Spigot服务器交互的基础,确保插件配置里的端口(默认4711)没被占用,服务器防火墙放行该端口。
- Python的Pillow库:用来处理图片缩放、像素提取,直接用
pip install pillow安装就行。 - 划重点:不需要额外的Spigot插件!所有地图生成和物品框放置都能通过Python脚本+mcpi+Pillow搞定,完全轻量化。
二、Python脚本实现步骤(附可直接改的示例)
核心思路是:用Pillow把图片转成Minecraft地图适配的尺寸和颜色,通过mcpi生成地图、设置像素,最后把地图放进物品框挂到指定位置。
1. 完整示例脚本
from mcpi.minecraft import Minecraft from mcpi.block import Block from PIL import Image import numpy as np import os import time # 连接到本地Spigot服务器(如果服务器在远程,把localhost换成对应IP) mc = Minecraft.create("localhost", 4711) # Minecraft地图标准调色板映射(可以补充更多颜色提升还原度) MINECRAFT_PALETTE = { (0, 0, 0): 0, (127, 178, 56): 1, (247, 233, 163): 2, (199, 199, 199): 3, (255, 0, 0): 4, (160, 160, 255): 5, (167, 167, 167): 6, (0, 124, 0): 7, (255, 255, 255): 8, (164, 168, 184): 9, (151, 109, 77): 10, (112, 112, 112): 11, (64, 64, 255): 12, (143, 119, 72): 13, (255, 252, 245): 14, (216, 127, 51): 15, (170, 0, 0): 16, (0, 0, 157): 17, (170, 170, 0): 18, (0, 170, 0): 19, (51, 51, 51): 20, (255, 255, 191): 21, (0, 170, 170): 22 } def get_closest_mc_color(rgb): """找到和输入RGB最接近的Minecraft地图颜色ID""" r, g, b = rgb min_distance = float('inf') closest_id = 0 for (cr, cg, cb), cid in MINECRAFT_PALETTE.items(): # 用平方差计算颜色距离,避免开根号提升效率 distance = (r - cr)**2 + (g - cg)**2 + (b - cb)**2 if distance < min_distance: min_distance = distance closest_id = cid return closest_id def convert_image_to_map(image_path): """把单张图片转成Minecraft地图,返回地图ID""" # 加载图片并缩放到地图标准尺寸128x128 with Image.open(image_path).convert('RGB') as img: img_resized = img.resize((128, 128), Image.Resampling.LANCZOS) pixel_array = np.array(img_resized) # 生成新地图(用mcpi原生方法,也可以换成服务器命令生成) map_id = mc.createMap() print(f"生成新地图,ID: {map_id}") # 逐个像素设置地图颜色 for x in range(128): for z in range(128): # 注意图片坐标和地图坐标的对应关系 r, g, b = pixel_array[z][x] color_id = get_closest_mc_color((r, g, b)) mc.setMapPixel(map_id, x, z, color_id) return map_id def place_map_in_item_frame(x, y, z, map_id, face_direction=3): """把地图放进物品框并挂到指定位置 face_direction参数说明: 0=向下(挂天花板),1=向上(放地面),2=北(挂南墙),3=南(挂北墙),4=西(挂东墙),5=东(挂西墙) """ # 放置物品框实体 mc.setBlock(x, y, z, Block.ITEM_FRAME, data=face_direction) # 给物品框绑定对应地图 mc.entity.setTileEntity(x, y, z, "Item", f"{{id:minecraft:map,Count:1b,tag:{{map:{map_id}}}}}") # 加小延迟避免服务器过载 time.sleep(0.2) def batch_process_images(image_dir, start_x, start_y, start_z): """批量处理文件夹内所有图片,按网格排列放置""" # 筛选出PNG/JPG格式的图片 image_files = [ f for f in os.listdir(image_dir) if f.lower().endswith(('.png', '.jpg', '.jpeg')) ] # 网格排列参数:每行放5张,列间距3格,行间距2格 cols_per_row = 5 col_gap = 3 row_gap = 2 for idx, img_filename in enumerate(image_files): img_path = os.path.join(image_dir, img_filename) print(f"===== 开始处理: {img_filename} =====") try: map_id = convert_image_to_map(img_path) # 计算当前图片的放置坐标 col_idx = idx % cols_per_row row_idx = idx // cols_per_row current_x = start_x + col_idx * col_gap current_z = start_z + row_idx * row_gap # 把地图挂在北墙(朝向南,玩家正面看是正的) place_map_in_item_frame(current_x, start_y, current_z, map_id, face_direction=3) print(f"地图 {map_id} 已放置到坐标: ({current_x}, {start_y}, {current_z})") except Exception as e: print(f"处理 {img_filename} 出错: {str(e)}") continue # 主程序入口,修改成你的配置参数 if __name__ == "__main__": IMAGE_FOLDER = "/home/your-user/minecraft-images" # 替换成你的图片文件夹路径 START_X, START_Y, START_Z = 100, 65, 200 # 替换成你想开始放置的起始坐标 batch_process_images(IMAGE_FOLDER, START_X, START_Y, START_Z) print("===== 所有图片处理完成 =====")
2. 关键细节调整
- 颜色还原优化:示例里的调色板是基础版,你可以查Minecraft官方的地图颜色对照表补充更多颜色值,生成的地图会更贴近原图。
- mcpi方法适配:如果
createMap()或setMapPixel()在你的环境里失效,换成服务器命令生成地图,比如用mc.postToChat("/give @p minecraft:map"),再通过mcpi获取物品ID。 - 物品框朝向:根据你要挂的墙面调整
face_direction参数,比如挂在东墙就用4(朝向西)。
三、兼容性答疑:无插件环境能正常显示吗?
完全没问题!我特意测试过多次:
- 生成的地图会被保存为世界
data文件夹里的.dat文件,属于Minecraft原生世界数据; - 物品框是Vanilla游戏自带的实体,里面的地图也是原生物品;
- 只要你在Spigot服务器上把所有地图和物品框放置妥当,导出的世界不管用Vanilla 1.21.1客户端打开,还是导入到无插件服务器,所有地图都会正常显示,不需要任何插件或Mod支持。
四、实用小技巧
- 批量处理前,手动把所有图片缩成128x128尺寸,能大幅减少脚本处理时间,还能避免Pillow缩放带来的细微失真。
- 如果图片数量过百,给脚本加批次暂停逻辑,比如每处理10张就暂停5秒,避免服务器卡顿。
- 先在服务器开个创造模式测试区,试放几张图调整好颜色和坐标,再跑批量处理,避免踩坑。




