Python(Jython)从图片中的像素播放笔记

时间:2010-03-02 16:53:42

标签: python image-manipulation jython

这来自课程作业:

这个程序是关于听色彩的。我们将图片视为钢琴乐谱。 编写一个名为listenToPicture的函数,它将一张图片作为参数。它首先显示了图片。接下来,它将遍历每第4行中的每第4个像素并执行以下操作。它将计算像素的红色,绿色和蓝色级别的总和,除以9,然后将结果添加到24.该数字将是playNote播放的音符编号。 这意味着像素越暗,音符越低;像素越亮,音符越高。它将以全音量(127)播放该音符,持续十分之一秒(100毫秒)。每次移动到新行时,它都会在控制台上打印出行号(y值)。 您的主要功能将要求用户选择带有图片的文件。它将打印要播放的音符数(即图像中的像素数除以16;为什么?)。然后它将调用listenToPicture函数。

好的,我编辑了迄今为止的内容,我唯一没想到的(我相信)是如何打印main函数中的音符数。顺便说一句,感谢所有帮助过的人。你们真是太棒了。有没有可以捐赠给这个网站的地方?

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 个答案:

答案 0 :(得分:1)

Robbie适合循环的宽度/高度。

用于获取像素并播放音符的循环看起来好像是获得所有像素并且每次获得唯一的x和y时都播放它们。您应该做的是将像素设置为(x,y)然后拉出rgb值并在其上调用播放音符。你真的不应该需要第3个for循环。你离我不太远。尝试用简单的英语按逻辑步骤编写问题。在我开始编码之前,我发现这有点帮助。

祝你好运。

答案 1 :(得分:1)

您之前询问过similar things。好吧,既然你没有在实际检索像素值方面放任何代码,我会假设你仍然无法做到这一点。我知道这超出了你的问题,但上次你对你的问题非常模糊,并表示你需要更多的帮助,而不仅仅是你提出的要求。如果没有必要,那么就忽略它。我只是想提供一些建议,你可以接受或离开它。

如果您还没有弄清楚如何读取像素,建议您使用PIL。它具有打开记录here图像的功能。然后,您可以使用相同页面上记录的getpixel按x和y值访问图像中的像素。

为了播放音符,我建议您查看PyAudio模块,然后制作您自己写入开放音频流的各种频率的正弦曲线(取决于像素的大小)。这个部分可能有更好的软件包,但这是我在Python音频中的小冒险中使用的。

对于音频内容,我会尝试在固定频率下输出声音,然后再尝试发出变化的频率。

修改 你的循环现在看起来更好,所以我拿出了关于你的循环的东西。