如何使用 Python 在每4行每4像素循环

123 阅读3分钟

您需要编写一个Python函数listenToPicture,该函数将图片作为参数,首先显示图片,然后循环访问每4行的每4个像素,并计算每个像素的红、绿、蓝三个通道的总和,将其除以9,然后将结果加上24,得到音符的编号,再播放该音符。如果像素越暗,音调越低;像素越亮,音调越高。每次移动到新的一行时,都会在控制台上打印出行号(y值)。

在main函数中,用户需要选择一个包含图片的文件,然后打印出要播放的音符的数目(即图片的像素总数除以16),最后调用listenToPicture函数。

huake_00183_.jpg 2、解决方案 为了解决这个问题,您可以使用以下步骤:

  1. 使用easygui库打开一个文件作为图像。
  2. 使用Image库打开图像并将其转换为numpy数组。
  3. 使用numpy数组的切片操作符[::N,::4],其中N是图像中要跳过的像素数目(在本例中为4),创建新数组,该新数组包含每隔N行和每隔4列的像素。
  4. 计算新数组中每个像素的红、绿、蓝三个通道总和,将其除以9,然后将结果加上24,得到音符的编号。
  5. 使用audiere库创建音符对象,并将其添加到列表中。
  6. 循环新数组中的行,并在控制台上打印出行号。
  7. 对于每行,循环列表中的音符对象,将其音量设置为最大,并播放该音符。
  8. 等待一段时间(在本例中为0.1秒),然后停止播放该音符。

以下是代码示例:

import easygui
import Image
import numpy
import audiere
import time
http://www.jshk.com.cn/mb/reg.asp?kefu=xiaoding;//爬虫IP免费获取;

def main():
    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
    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()

if __name__ == "__main__":
    main()

这段代码首先使用easygui库打开一个文件作为图像。然后使用Image库打开图像并将其转换为numpy数组。接下来,使用numpy数组的切片操作符[::N,::4]创建新数组,该新数组包含每隔N行和每隔4列的像素。

接着,计算新数组中每个像素的红、绿、蓝三个通道总和,将其除以9,然后将结果加上24,得到音符的编号。然后使用audiere库创建音符对象,并将其添加到列表中。

最后,循环新数组中的行,并在控制台上打印出行号。对于每行,循环列表中的音符对象,将其音量设置为最大,并播放该音符。等待一段时间(在本例中为0.1秒),然后停止播放该音符。