用Python批量给Minecraft Classic重制版替换材质
Minecraft Classic的默认材质看久了,总觉得没有意思,既然Java版和基岩版可以换材质,那网页重制版又为什么不能呢?
其实要给网页版替换材质,只需把材质包里图像的名称改一改,换掉原图像就好了。当然,如果纯手动的话,要花很长时间,幸好我们还有Python,事情就容易很多啦。
完整Python代码如下(genTex用于重命名/裁剪/重新着色Minecraft材质包里的图像文件,renmPrev用来重命名渲染器生成的文件,genResized用来补全几个不需要三维渲染的图标。另外原木方块因为顶面和侧面材质不同,故物品栏图标需要单独手动渲染):
import os
from shutil import copyfile
from PIL import Image, ImageOps
#src_path = r'E:/Bobcorn/Textures/ocdpack187113693/assets/minecraft/textures/blocks/'
#src_path = r'G:/Bobcorn/Images/Block Renders/renders/'
src_path = r'G:/Bobcorn/Minecraft Classic Remake/assets/textures-ocd/'
out_path = r'./tex-maker/'
names = {
'grass_top': 'grass',
'grass_side': 'grass_dirt',
'stone': 'stone',
'dirt': 'dirt',
'planks_oak': 'wood',
'flower_rose': 'red_flower',
'flower_dandelion':'yellow_flower',
'water_still': 'water',
'sapling_oak': 'bush',
'cobblestone': 'rock',
'bedrock': 'bedrock',
'sand': 'sand',
'gravel': 'gravel',
'log_oak': 'tree_side',
'log_oak_top': 'tree_top',
'leaves_oak': 'leaves_opaque',
'mushroom_red': 'red_mushroom',
'mushroom_brown': 'brown_mushroom',
'lava_still': 'lava',
'gold_ore': 'rock_gold',
'iron_ore': 'rock_bronze',
'coal_ore': 'rock_coal',
'gold_block': 'gold',
'sponge': 'sponge',
'glass': 'glass',
'wool_colored_red': 'color0',
'wool_colored_orange': 'color1',
'wool_colored_yellow': 'color2',
'wool_colored_lime': 'color3',
'wool_colored_green': 'color4',
'wool_colored_brown': 'color5',
'wool_colored_light_blue': 'color6',
'wool_colored_cyan': 'color7',
'wool_colored_blue': 'color8',
'wool_colored_black': 'color9',
'wool_colored_purple': 'color10',
'wool_colored_magenta': 'color11',
'wool_colored_pink': 'color12',
'wool_colored_gray': 'color13',
'wool_colored_silver': 'color14',
'wool_colored_white': 'color15'
}
#Names of preview icons...
names_prev = {
'stone': '2',
'dirt': '3',
'wood': '4',
'rock': '9',
'sand': '11',
'gravel': '12',
'leaves_opaque': '14',
'gold': '21',
'sponge': '22',
'glass': '23',
'color0': '24',
'color1': '25',
'color2': '26',
'color3': '27',
'color4': '28',
'color5': '29',
'color6': '30',
'color7': '31',
'color8': '32',
'color9': '33',
'color10': '34',
'color11': '35',
'color12': '36',
'color13': '37',
'color14': '38',
'color15': '39'
}
names_resz = {
'red_flower': '5',
'yellow_flower': '6',
'bush': '8',
'red_mushroom': '15',
'brown_mushroom': '16'
}
rec = ['grass','leaves_opaque']
crp = ['rock_gold','rock_coal','rock_bronze']
def recolor(n):
srci = Image.open(out_path + n + '.png').convert('RGBA')
#Preserve the alpha value before converting it..
r,g,b,alpha = srci.split()
gray = srci.convert('L')
rec = ImageOps.colorize(gray, (0,0,0), (255,255,255), (87,182,50), 0 ,255 ,157).convert('RGBA')
#Recover its transparency..
rec.putalpha(alpha)
#rec.show()
rec.save(out_path + n + '.png')
def crop(n):
srci = Image.open(out_path + n + '.png') #.convert('L')
cropped = srci.crop((0,0,srci.width,srci.width))
#cropped.show()
cropped.save(out_path + n + '.png')
def resize(n, op):
srci = Image.open(src_path + n + '.png') #.convert('L')
resized = srci.resize((32,32),Image.NEAREST)
resized.save(op)
def genTex():
#Prepare Output Folder...
if (not os.path.exists(out_path)):
os.mkdir(out_path)
for i in names.keys():
if (os.path.exists(src_path + i + '.png')):
copyfile(src_path + i + '.png', out_path + names[i] + '.png')
else:
print('ERROR: File not found: ' + src_path + i + '.png')
for j in rec:
if (os.path.exists(out_path + j + '.png')):
recolor(j)
else:
print('ERROR: File not found: ' + src_path + j + '.png')
for k in crp:
if (os.path.exists(out_path + k + '.png')):
crop(k)
else:
print('ERROR: File not found: ' + src_path + k + '.png')
def genResized():
#Prepare Output Folder...
if (not os.path.exists(out_path)):
os.mkdir(out_path)
for i in names_resz.keys():
if (os.path.exists(src_path + i + '.png')):
resize(i, out_path + names_resz[i] + '.png')
else:
print('ERROR: File not found: ' + src_path + i + '.png')
def renmPrev():
#Prepare Output Folder...
if (not os.path.exists(out_path)):
os.mkdir(out_path)
for i in names_prev.keys():
if (os.path.exists(src_path + i + '.png')):
copyfile(src_path + i + '.png', out_path + names_prev[i] + '.png')
else:
print('ERROR: File not found: ' + src_path + i + '.png')
def main():
#genTex()
#renmPrev()
genResized()
if __name__ == '__main__':
main()
上两张效果图:
BD Craft(五边形材质包):
OCD材质包:
细心的读者可能发现了,物品栏里的材质并没有跟随方块的材质改变,这是因为这个重制版把物品的图标预先渲染成了图像。那么要想改变这个,就只能自己动手渲染了。可是Python并不能很方便地渲染这种三维图形,于是我便在网上找到了用于制作Minecraft方块预览图像的工具,并稍加改造,使得批量渲染变得更加方便。
可以在这里查看:https://codepen.io/devbobcorn/pen/LYZxgep
最终效果:
至此,材质包自定义圆满完成,撒花!