Ответ 1
Настроенные диапазоны приходят на ум range(0, len(), 4)
, но я не знаю тип вашего pic
.
Напишите функцию, называемую listenToPicture, которая принимает одно изображение в качестве аргумента. Сначала он показывает картину. Далее, он будет циклически проходить каждый 4-й пиксель в каждой четвертой строке и делать следующее. Он вычислит общее количество красного, зеленого и синего уровней пикселя, разделите его на 9, затем добавьте результат в 24. Это число будет номером ноты, воспроизводимым в playNote. Это означает, что чем темнее пиксель, тем ниже заметка; чем светлее пиксель, тем выше нота. Он будет воспроизводить эту ноту на полном объеме (127) на десятую часть секунды (100 миллисекунд). Каждый раз, когда он перемещается в новую строку, он выводит номер строки (значение y) на консоли. Ваша основная функция попросит пользователя выбрать файл с изображением. Он будет печатать количество замещаемых нот (число пикселей на изображении, деленное на 16, почему?). Затем он вызовет функцию listenToPicture.
Вот что я до сих пор, и я не уверен, как настроить цикл через каждые 4-е пикселы в каждой четвертой строке. Любая помощь будет очень признательна.
def main():
pic= makePicture( pickAFile())
printNow (getPixels(pic)/16)
listenToPicture(pic)
def listenToPicture(pic):
show(pic)
w=getWidth(pic)
h=getHeight(pic)
for px in getPixels(pic):
r= getRed(px)
g= getGreen(px)
b= getBlue(px)
tot= (r+g+b)/9
playNote= tot + 24
Настроенные диапазоны приходят на ум range(0, len(), 4)
, но я не знаю тип вашего pic
.
Вот некоторые строительные блоки, на которых вы можете основывать свою программу на:
#!/usr/bin/env python
import easygui
import Image
import numpy
filename = easygui.fileopenbox() # pick a file
im = Image.open(filename) # make picture
image_width, image_height = im.size
im.show() # show picture
ar = numpy.asarray(im) # get all pixels
N = 4
pixels = ar[::N,::4] # every 4th pixel in every N-th row
notes = pixels.sum(axis=2) / 9 + 24 # compute notes [0, 52]
print "number of notes to play:", notes.size
Заметки могут соответствовать разным тонам. Я использую здесь равный темперированный масштаб:
# play the notes
import audiere
import time
d = audiere.open_device()
# Notes in equal tempered scale
f0, a = 440, 2**(1/12.)
tones = [d.create_tone(f0*a**n) for n in range(-26, 27)] # 53
for y, row in enumerate(notes):
print N*y # print original row number
for t in (tones[note] for note in row):
t.volume = 1.0 # maximum volume
t.play()
time.sleep(0.1) # wait around 100 milliseconds
t.stop()
Возможно, вы захотите посмотреть этот вопрос. Человек, который задал этот вопрос, кажется, работает над тем же проектом, что и вы.
Я бы предположил, что лучший способ - рассчитать смещение 4 строк и, когда в конце строки добавить его в текущую позицию. Таким образом, у вас есть две итерации: одна внутри строки, пропускающая 3 пикселя, и одна в конце каждой строки, пропускающая 3 строки. Но, как отметил мс, без какой-либо информации о вашем объекте pic, мы не можем больше помочь.