文件操作–我的世界图片建造

我们在建造之前要捋清一下思路,建造方块用setBlock语句其中参数有xyz坐标和id。我们可以通过id来控制建造什么方块,xyz来控制建造在哪里。上节课做了一个将表格文件在我的世界建造出来的程序,我们是造了一个迷宫,那我们这次是不是可以将这个图片转换为一个表格文件

将图片转换为表格文件我们需要导入一个库文件——pillow
pip install -i https://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com pillow

这是安装pillow库的代码,复制上面的呢代码粘贴到cmd窗口就可以了,cmd窗口呼出方式按下win+r,在弹出窗口中输入cmd,再按下回车。

出现Successfully installed 表示安装

安装完成之后,我们就可以导入这个pillow文件库了

from PIL import Image
img = Image.open('你要打开的图片')#!这里是打开图片给这个图片存到一个名为img的变量中
img = Image.resize(100,100)#!这里是给图片重新设置大小,一个是宽一个是高
px = img.load()#!加载图片,将rgb数据存到一个名为px的变量中(rgb:red,green,blue。)

到这里我们就将图片转换为了rgb数据了,但是这个数据我们不能直接用。我们可以输出一下来看看他是个什么东西。

这个数据我们不能直接使用,它返回一个用于读取和修改像素的像素访问对象,但是我们可以利用之前学过的循环来获取它

x = 0  #!定义一个变量充当索引
while x < img.width: #!设置循环的范围,小于图片的宽度才执行循环
    z = 0 #!定义一个变量充当第二个索引
    while z < img.height: #!#!设置循环的范围,小于图片的高度才执行循环
        min_c = 255*3 #!设置rgb最大值255,255,255相加,为了找最小值距离
        pix = data[x,z] #!这里就是从data中拿到的rgb了,给他存到一个新的变量中去

我们先做一个颜色对照表,一会咱们可以用它来找相近的颜色(我的世界中染色羊毛颜色不是特别全,个别颜色可能没有我们得找相近的颜色)

color_dict = {0: [224, 223, 217],
            1: [230, 137, 2],
            2: [211, 57, 191],
            3: [38, 184, 214],
            4: [237, 210, 15],
            5: [143, 207, 18],
            6: [230, 147, 181],
            7: [76, 76, 75],
            8: [181, 176, 154],
            9: [18, 169, 175],
            10: [152, 30, 191],
            11: [56, 55, 181],
            12: [147, 80, 27],
            13: [108, 131, 33],
            14: [193, 34, 30],
            15: [6, 7, 10]
            }

接下来我们让读取的图片rgb和我们写好的对照表对比一下颜色,找一找接近的颜色,我么是靠距离来确定和哪个颜色接近的
例如:
假如一个颜色的值是200,我给定的颜色有 100 300 150 ,那200这个颜色离一定是离150比较近,因为 150-100 = 50 ,其余两个不管怎么减都是100远大于50.

from PIL import Image
from easygui import fileopenbox
import mcpi.minecraft as mmc
mc = mmc.Minecraft.create()
color_dict = {0: [224, 223, 217],
            1: [230, 137, 2],
            2: [211, 57, 191],
            3: [38, 184, 214],
            4: [237, 210, 15],
            5: [143, 207, 18],
            6: [230, 147, 181],
            7: [76, 76, 75],
            8: [181, 176, 154],
            9: [18, 169, 175],
            10: [152, 30, 191],
            11: [56, 55, 181],
            12: [147, 80, 27],
            13: [108, 131, 33],
            14: [193, 34, 30],
            15: [6, 7, 10]
            }
px,py,pz = mc.player.getTilePos()
img = Image.open(fileopenbox())
data = img.load()
x = 0
while x < img.width:
    z = 0
    while z < img.height:
        min_c = 255*3
        pix = data[x,z]
        for d,l in color_dict.items(): #!遍历对照表,因为对照表是个字典所以我们需要从里面拿出key和value两个参数。
            bias = abs(l[0]-pix[0])+abs(l[1]-pix[1])+abs(l[2]-pix[2])#!将对照表的rgb和图片的rgb相减结果相加,并取绝对值,因为不一定哪个大,有可能是负数
            if bias<min_c: #!判断bias 是否小于min_c
                min_c = bias #!替换 min_c的数据
                bd = d
        mc.setBlock(px+x,py,pz+z,35,bd) #建造方块
        z+=1
    x+=1
mc.postToChat('绘制完成!!')

我对程序进行了一些修改,让他能够实现自己选择图片来建造,用原来的方法也一样可以实现,下面我们来看看效果。

  • Avatar photo

    宁妄

    一个热爱自然却被困在代码世界的“人”

    Related Posts

    牛马耕地

    时空穿梭

    视频教程:

    One thought on “文件操作–我的世界图片建造

    发表回复

    您的邮箱地址不会被公开。 必填项已用 * 标注