2017-03-24 61 views
0

我有一个功能强大的位图,代码长达22 x 22像素,但是除了那些奇怪的事情发生,任何人都有任何想法为什么? 该程序将用于在Minecraft /可能的其他“基于像素的”游戏中自动构建大型结构。目前的状态正在工作达22by22pixels,但没有更多,我想知道为什么/如何解决它。Python - 将位图图像转换为每个像素的颜色列表

当前出错消息(图像超过22像素): KeyError异常(同时搜索调色板,原因:颜色不再RGB的元组,但由于未知原因

所需尺寸的单个数字是高达128到128,结果是(对于2乘1位图) - 简化为它可能必须是正方形: [(0,0,'0-0-0',黑色),(0,1,'255, 255,255' ,白色)]

当前程序:

# palette.py 
# Palette with rgb-values depicting different blocks in-game: 
predef = {}   #initialize a list variable, the fill it: 
predef['255-255-255'] = 'air' 
predef['255---0---0'] = 'redstone_block' 
predef['--0--38-255'] = 'lapis_block' 
predef['0-0-0'] = 'coal_block' 

# main.py 
from PIL import Image 
import numpy as np 
import json 
import palette 

def convert(filein, pal = palette.predef, zz = 0): 
    ''' 
    due to a combined internal/external palette system ignore the warnings about incoherent types of str and dict 
    as the dict is the internal, and the str is the filename of a json containing a dict. 

    :param filein: Filename of bitmap 
    :param pal: blank to use internal, or specify a separate palette.json 
    :return: 
    ''' 
    customset = []     # customset list for blocks and positions 

    if pal is not palette.predef: 
     with open(pal) as js: 
      pal = json.load(js) 
     #print(pal) #debug to check palette 

    im = Image.open(str(filein)) 
    p = np.array(im) #.reshape(-1, 3) 
    print('width/height:', len(p), 'by', len(p)) 
    for y in range(0, len(p)): 
     for x in range(0, len(p)): 
      pix = p[y][x] 
      pix = str(pix).replace(' ', '-').replace('[', '').replace(']', '') 
      print(pix) 
      pixcolor = (y, x, pix, pal[pix])  # Switch comment statu on these to see the error 
      #pixcolor = pix      # instead of the error message 

      customset.append(pixcolor) 

    return customset 

print(convert('./1.bmp', './palettetest.json') # works with a bitmap up to 22 by 22 
+0

convert()函数中的zz尚未实现,但应该是z =的起点。为建设。还有一些颜色实现,它们在palette.py文件中作为rgb值 – Bjornolil

回答

0

发现一个解决方案:

从PIL进口图片 进口numpy的作为NP 进口JSON 导入时间 进口调色板#这是为什么在需要时,我们有--0 --- 0 --- 0以上? -unknown

def convert(filein, pal = palette.predef, zz = 0): 
    ''' 
    due to a combined internal/external palette system ignore the warnings about incoherent types of str and dict 
    as the dict is the internal, and the str is the filename of a json containing a dict. 

    :param filein: Filename of bitmap 
    :param pal: blank to use internal, or specify a separate palette.json 
    :return: 
    ''' 
    customset = []     # customset list for blocks and positions 
    if pal is not palette.predef: 
     with open(pal) as js: 
      pal = json.load(js) 
     #print(pal) 

    photo = Image.open(filein) # opens the image 
    photo = photo.convert('RGB') 

    width = photo.size[0] 
    height = photo.size[1] 
    print('Size of current image is: {} by {}\n'.format(width, height)) 
    for y in range(0, height): 
     row = '' 

     for x in range(0, width): 
      RGB = photo.getpixel((x,y))  # Gets the color value of pixel in color rgb 
      R, G, B = RGB     # Splits the rgb values 
      rgb= str(RGB).replace(', ','-').replace('(', '').replace(')', '') 
      info = 'x: {}, y: {} - pixelcolor: {}, block: {}'.format(x, y, rgb, pal[rgb]) 
      time.sleep(0.01) # to releave the cpu a bit 
      customset.append(info) 
      #print(info) 

    return customset 

print(convert('./1.bmp')) 
+0

如果问题有更好的解决方案,并且/或者如果您知道**为什么**第一个代码获得22x22像素以上的图像损坏 – Bjornolil