2010-11-18 2 views
4

Я использую PIL и режимы изображения в Python. Я хочу, чтобы создать изображение с помощью этого кода:Python loop для модуля image и pil

imagesize = (12,12) 
image = Image.new("RGB",imagesize,color=None) 

Я буду использовать эту функцию, чтобы поместить пиксели на моем изображении:

.putpixel(xy, color) 

цвет в списке кортежей. Для Exemple:

RGB = [((255, 255, 255),(207, 103, 36),(204, 93, 21),(204, 93, 21),(204, 93, 21), (.......some more RGB tuples.....)] 

мне нужен цикл, который в .putpixel (ху, цвет):

цвета увеличивается на один шаг каждый раз. Например, RGB [0], следующий цикл RGB [1] и т. Д. Пока этот цикл выполняется, x и y мне труднее. x идет от 1 до 12 (размер изображения), а y равно 0, а затем, когда x достигает изображения, он возвращается к 1-12, а y теперь равен 1. Цикл заканчивается, когда x и оба достигают конца размера изображения.

Может ли кто-нибудь мне помочь? Я новичок в Python.

С уважением,

Favolas

EDIT

P: S - Забыл сказать, что так как это для школьного проекта я не могу использовать любые методы, кроме img.new, img.show и img.outpixel

+1

На боковой панели пульт обычно очень медленный. Вероятно, вы захотите использовать putdata, установив данные изображения одновременно. –

+0

Не похоже, что вы сделали _any_ попытку решить это самостоятельно ... – martineau

ответ

2

Хорошо, мой комментарий сверху должен был действительно войти в ответ. Я должен уснуть. Вы можете просто поместить свои пиксельные данные в изображение сразу. Метод putdata PIL.Image принимает список кортежей, составляющих пиксели изображений. Итак:

img = PIL.Image.new("RGB", (12, 12)) 
img.show() # see a black image 
pixels = [(255,0,0)]*(12*12) 
img.putdata(pixels) 
img.show() # see a red image 
+1

Это для школьного проекта, и я не могу использовать какие-либо методы рядом с img.new, img.show и img.putpixel :) – Favolas

1

Это зависит от того, как вы хотите поместить цвета RGB. Например:

for y in range(12): 
    for x in range(12): 
    img.putpixel(x, y, RGB[(x + 12*y)%len(RBG)] 

поставит от 0 до N RBG цветов в 0 до N пикселей, от 0 до N RGBS до 0 + N, 2N пикселей и так далее. Есть еще варианты - выбрать цвет случайным образом:

import random 
... 
for y in range(12): 
    for x in range(12): 
    img.putpixel(x, y, RBG[random.randint(0, len(RGB)-1)] 

Оптимизация для обоих случаев остается в качестве упражнения.

+1

Привет. Спасибо за ваш ответ. Но это дает мне эту ошибку: Traceback (последний последний звонок): Файл «», строка 48, в ZeroDivisionError: целочисленное деление или по модулю ноль – Favolas

+1

@Favolas спасибо, исправлено. '(x + 12 * y)% len (RGB)' – khachik

1

Если вложенные циклы, я от 0 до 11 и J от 0 до 11, а затем индексировать приращением в одномерный вектор вам необходимо получить X [J + я * 11].

>>> for i in range(5): 
... for j in range(5): 
...  print j + i*5 

напечатает 0 до 24.

других ответов более эффективных способов заполнения изображений, и, вероятно, более вещие способы сделать это тоже. Но это общий ответ!

Обратите внимание, что это переменные, начинающиеся с нуля, а не ОДИН. Для вашего изображения 12x12 пикселей действительный диапазон xy составляет от 0 до 11.

1

Если у нас есть эти два списка:

xy = [(1,2),(3,4),(5,6),(7,8)] 
rgb = [(0,0,255), (0,255,0), (255,0,0), (255,255,0), (255,255,255)] 

Мы можем отобразить список XY в список RGB в словарь:

d = dict(zip(xy,rgb)) 

который выглядит следующим образом:

>>> print(d) 
{(1, 2): (0, 0, 255), (5, 6): (255, 0, 0), (3, 4): (0, 255, 0), (7, 8): (255, 255, 0)} 

Итак, теперь у нас есть словарь, ключ - XY, а значение соответствует соответствующему RGB. Теперь мы можем сопоставить эти пары ключ-значение с помощью list comprehension:

[putpixel(x,col) for x,col in d.items()] 

В качестве теста макет putpixel() метод, который печатает входы проверить результаты:

def putpixel(xy,col): 
    print('%s set to %s' % (xy,col)) 

>>> result = [putpixel(x,col) for x,col in d.items()] 
(1, 2) set to (0, 0, 255) 
(5, 6) set to (255, 0, 0) 
(3, 4) set to (0, 255, 0) 
(7, 8) set to (255, 255, 0) 

Список постижение обычно возвращает список обработанных элементов, в этом случае мы не возвращаем результат из putpixel(), поэтому наш список результатов будет содержать пустые контейнеры.

Смежные вопросы