2017-01-26 3 views
1

그래서 내가 생성하고이 그리드의 각 값을 색을 나타내는 원하는. 이것은 생성 코드 : 예파이썬 색상 코드 값을 그리드 및 수출로 jpg

for row in self.grid: 
     for item in range(len(row)): 
      row[item] = random.randint(-10, 20) 

, I이 그리드 가지고

[1, -7, 20, 12, 6, 5, 11, -1, -3, 8] 
[18, 10, 2, -3, -4, 5, 10, 12, 10, -6] 
[11, 19, 8, 2, -8, 5, -4, -4, 16, 1] 
[-7, -7, 11, 13, -6, -8, 0, 10, 14, 9] 
[16, 16, 1, 8, -7, 19, 9, 20, 2, 2] 
[-3, 2, 4, 16, 20, -4, -1, -10, 19, 4] 
[9, -9, 11, 5, 7, -7, 5, 15, -1, -6] 
[11, -5, -2, -9, 19, -7, 14, -3, -8, -8] 
[1, 13, 19, 9, 13, 7, 9, 11, -3, 19] 
[15, -3, -10, 13, 2, 6, -7, -8, -6, 15] 

하고 난 각 값 (즉, 범위의 일부) 특정 색상에 상응 할. 예를 들어 1에서 5까지의 범위는 녹색입니다. 그 후 우승자가 PIL 일 것이라고 생각되는 jpg 이미지로 내보내려면 진행 방법을 잘 모르겠습니다.

답변

3

여기 당신이 원하는 것을 생각 구현입니다. 이미지가 JPEG 형식으로 저장되면 색상이 변경됩니다.

import random 

from PIL import Image 

COLOUR_MAP = { 
    range(-10, 0): (255, 0, 0), 
    range(0, 10): (0, 255, 0), 
    range(10, 21): (0, 0, 255) 
} 


def create_grid(n): 
    return [[random.randint(-10, 20) for _ in range(n)] for _ in range(n)] 


def map_to_colour(x): 
    for r, c in COLOUR_MAP.items(): 
     if x in r: 
      return c 
    else: 
     raise ValueError(x) 


def map_values_to_colours(value_grid): 
    return [[map_to_colour(x) for x in row] for row in value_grid] 


def draw_image_from_colour_grid(colour_grid): 
    im = Image.new(mode='RGB', size=(len(colour_grid), len(colour_grid[0]))) 
    im.putdata([x for row in colour_grid for x in row]) 
    im.show() 
    im.save('out.jpg', 'JPEG') 


if __name__ == '__main__': 
    value_grid = create_grid(10) 
    colour_grid = map_values_to_colours(value_grid) 
    draw_image_from_colour_grid(colour_grid) 

출력

+0

주 -'COLOUR_MAP' – asongtoruin

+0

이 크다을 정의 할 때 오히려 range''보다'xrange'를 사용해야 할 것입니다 파이썬 2.x에서, 나는 python 3.x를 사용하면 범위와 xrange에 문제가 없습니다. – Nick

+1

@asongtoruin, 그렇지 않습니다. 2.x를 사용하면 range가 목록을 작성하므로 매우 큰 데이터 세트의 경우 생성자를 사용하는 xrange를 원하지만이 예제의 목록은 작아서 결과가 아닐 수도 있습니다. – Wyrmwood

0

당신은 Pillow 모듈에 Image.putdata() 방법을 사용할 수 있습니다 :

from PIL import Image 

grid = [ 
    [1, -7, 20, 12, 6, 5, 11, -1, -3, 8], 
    [18, 10, 2, -3, -4, 5, 10, 12, 10, -6], 
    [11, 19, 8, 2, -8, 5, -4, -4, 16, 1], 
    [-7, -7, 11, 13, -6, -8, 0, 10, 14, 9], 
    [16, 16, 1, 8, -7, 19, 9, 20, 2, 2], 
    [-3, 2, 4, 16, 20, -4, -1, -10, 19, 4], 
    [9, -9, 11, 5, 7, -7, 5, 15, -1, -6], 
    [11, -5, -2, -9, 19, -7, 14, -3, -8, -8], 
    [1, 13, 19, 9, 13, 7, 9, 11, -3, 19], 
    [15, -3, -10, 13, 2, 6, -7, -8, -6, 15], 
    ] 

# record the number of rows and columns in the data 
rows = len(grid) 
cols = len(grid[1]) 

# create a new image, in the correct size 
im = Image.new('RGB', (rows, cols)) 

# convert to RGB tuples - for now we're just showing an image of different shades of red. 
grid = [(abs(x)*20, 0, 0) for row in grid for x in row] 

# using putdata we apply the values in the tuples from top left to bottom right 
im.putdata(grid) 
im.save('example.jpg')