Python (Jython) 从图片像素播放音符

0 投票
2 回答
1985 浏览
提问于 2025-04-15 19:55

这是一个课堂作业的内容:

这个程序是关于“听颜色”的。我们会把图片当作钢琴乐谱来处理。写一个叫做 listenToPicture 的函数,它接受一张图片作为参数。首先,它会显示这张图片。接下来,它会遍历每第四行的每第四个像素,做以下操作:计算这个像素的红色、绿色和蓝色的总值,然后把这个总值除以9,再加上24。这个结果就是 playNote 要播放的音符编号。也就是说,像素越暗,音符越低;像素越亮,音符越高。它会以最大音量(127)播放这个音符,持续十分之一秒(100毫秒)。每当它移动到新的一行时,会在控制台上打印出行号(y 值)。你的主函数会要求用户选择一张图片文件。它会打印出要播放的音符数量(这个数量是图片中像素总数除以16;为什么呢?)。然后它会调用 listenToPicture 函数。

好的,我已经编辑了我目前的进展,唯一还没弄明白的(我认为)是如何在主函数中打印音符的数量。顺便说一下,感谢所有帮助过我的人。你们真棒。这个网站有地方可以捐款吗?

def main():
   pic=makePicture(pickAFile())
   show (pic)
   listenToPicture(pic)

def listenToPicture(pic):
   w=getWidth(pic)
   h=getHeight(pic)

   for y in range(0,h,4):
       printNow(str(y))
       for x in range (0,w,4):
            px=getPixel(pic,x,y)                            
            r=getRed(px)
            g=getGreen(px)
            b=getBlue(px)
            tot=((r+g+b)/9)+24
            playNote(tot,100,127)

2 个回答

1

你之前问过关于类似的问题。既然你没有提供任何代码来获取像素值,我猜想你可能还是不知道怎么做。我知道这可能超出了你原来的问题,但上次你提问时比较模糊,似乎需要的帮助比你问的更多。如果这些内容对你没有帮助,就当我没说。我只是想给你一些建议,你可以选择听或者不听。

如果你还没弄明白怎么读取像素,我建议你使用PIL库。这个库有关于打开图片的函数,详细信息可以在这里找到。然后你可以通过像素的x和y坐标来访问图片中的某个像素,使用的函数是getpixel,相关文档也在同一页面。

如果你想播放音符,我建议你看看PyAudio模块,自己制作不同频率的正弦波(根据像素的大小),然后把它写入一个打开的音频流。可能还有更好的库可以用,但这是我在Python音频小项目中用过的。

关于音频的部分,我建议你先试着输出一个固定频率的声音,再去尝试发出变化的频率。

编辑:你的循环看起来好多了,所以我把之前关于你循环的建议删掉了。

1

Robbie说的关于宽度和高度的循环是对的。

你现在用的循环是为了获取像素并播放音符,看起来是每次获取唯一的x和y时,就获取所有的像素并播放一遍。其实你应该只获取(x,y)这个点的像素,然后提取出它的rgb值,再调用播放音符的函数。你其实根本不需要第三个循环。你离正确答案不远了。试着把问题用简单的英语写成逻辑步骤,我发现这样在开始编码之前会帮助很多。

祝你好运。

撰写回答