Pythonでマインクラフト内にピクセルアートを作成

はじめに

2021-12-13_17.35.09.png

环境我使用Python搭建了运行Minecraft的环境,以下是参考步骤,可用于在Minecraft中进行Python编程的5个步骤。

执行环境如下:
Mincraft JE 1.12.2
Forge 1.12.2
Raspberry Jam Mod 0.92
Python 3.9.9

将图像转换为像素艺术。在Python中,我们使用Pillow和numpy来操作图像。

import numpy as np
from PIL import Image

将其转换为指定的像素数長辺が指定のピクセル数になるように元画像をリサイズします。
輝度の調整については後に記述します。

def load_picture(file_path, map_size, brightness):
    im = Image.open(file_path) #画像読み込み
    #輝度の調整
    con = ImageEnhance.Brightness(im)
    im = con.enhance(brightness)
    #長辺がmap_sizeになるように変換
    if im.size[0] > im.size[1]:
        resize_rate = map_size / im.size[0]
    else:
        resize_rate = map_size / im.size[1]
    #リサイズ
    im = im.resize((round(resize_rate*im.size[0]), round(resize_rate*im.size[1])))
    return im

使用Minecraft游戏中的方块我們將根據調整大小後的像素顏色來決定在Minecraft中對應的方塊。這次我們使用了16種羊毛顏色、土、金塊、書架和砂岩共20種方塊。除了羊毛外,我們還添加了膚色和棕色系方塊。每個方塊的顏色參考了Minecraft Wiki。地圖物品的格式。

3. 将每个像素替换为块
各ピクセルに近い色のブロックを選んでいきます。
色の類似はXYZ色空間のユークリッド距離で評価します。
各ピクセルと20種類のブロックの色の距離を計算し、一番近いブロックを当てはめていきます。
具体的な変換方法は以下を参考にしました。

CIE XYZ表色系(9): XYZ-RGB の変換式 と カラートライアングル

#CIE-XYZで各ピクセルの色に対応するblock_idに変更 im:リサイズ後の画像
def to_color(im):
    #各ブロックのXYZ色空間の一覧読み込み
    block_list = np.loadtxt(f"color_list/color_srgbxyz.csv", delimiter=",", skiprows=1)
    #RGB画像をXYZ色空間に変換
    rgb2xyz = (
            0.4124, 0.3576, 0.1805, 0,
            0.2126, 0.7152, 0.0722, 0,
            0.0193, 0.1192, 0.9505, 0
        )
    im_array = np.array(im.convert("RGB", rgb2xyz))
    #結果を格納するarray
    out = np.zeros(im.size, dtype=int).T
    #各ピクセルとブロックの色の距離算出して一番距離が近いブロックを当てはめていく
    for i in range(im.size[1]):
        for j in range(im.size[0]):
            dist = 100000
            for k in range(len(block_list)):
                dist_ = np.linalg.norm(im_array[i,j]-block_list[k,1:]) #ピクセルとブロックの色の距離算出
                if dist_ < dist:
                    out[i,j] = block_list[k,0]
                    dist = dist_
    out = Image.fromarray(out)
    return out

color_srgbxyz.csvにブロックidとXYZ色空間に変換した数値を記載。
羊毛のようにブロックidと種類のidを持つ場合は併記します。
後で100で割った商とあまりでブロックidと種類のidに分解します。

id,x,y,z
3500,242.3775,255,277.695      #羊毛:白
3501,143.6991,140.4342,67.7827 #羊毛:オレンジ
...
47,114.5236,120.709,85.3807    #本棚
3,115.1493,115.6188,89.0956    #土

4. 布置方块
我将进入《我的世界》游戏并开始放置方块。

#マインクラフトとの接続
mc = minecraft.Minecraft()

#ブロックの配置
for i in range(map_size):
    for j in range(map_size):
        #余白は白のウール
        if im[i,j] == 255:
            mc.setBlock(corner[0] + j, corner[1], corner[2] + i, block.WOOL.id, 0)
        #ウールなどブロックidと種類idを持つブロックの設置
        elif im[i, j] > 1000:
            id1, id2 = divmod(im[i, j], 100) #100で割った商がブロックid、あまりが種類id
            mc.setBlock(corner[0] + j, corner[1], corner[2] + i, int(id1), int(id2))
        #その他ブロックの設置
        else:
            mc.setBlock(corner[0] + j, corner[1], corner[2] + i, int(im[i, j]))

光的亮度

2021-12-13_20.36.48.png

结束我介绍了一种使用Python处理图像并在Minecraft内制作像素艺术的方法。我已将代码上传到GitHub上,如果方便的话,请随意使用。
GitHub链接:https://github.com/konishi0125/minecraft_pixel_art

bannerAds