第七题的网址:http://www.pythonchallenge.com/pc/def/oxygen.html,而且这道题不用网站截图了,以为除了一张png图片,什么文字都没有……源代码中也没有任何提示。现在是越来越难了!图片如下:
这个图片比较古怪的地方在于中间有一行好像被处理过了,说不定提示信息就在这里面!但是Python要用什么模块处理图片呢?经过搜索后,发现需要使用第三方库PIL(Python Imaging Library)。下载安装后,使用Eclipse的朋友注意了,可能需要重新配置一下pydev插件下的interpreter python。怎么使用这个库我就不多说了,还是得学习官方文档(PS:感觉文档写的不是很好……)。主要操作包括打开图片Image.open(file)和读取像素getpixel((i,j),其中i代表的是x轴方向,j代表的是y轴方向。读取像素的代码入下:
im=Image.open(path)#考虑到被处理像素的位置,这里取图片高度的一半index=im.size[1]/2
#保存图片的宽度width=im.size[0]data=[]
for i in range(0,width):data.append(im.getpixel((i,index)))print data
由于我们处理的部分是灰度图,R、G、B的值是相同的,所以我们只需要把R、G、B相同的像素点保存下来就可以了,尾部未处理的像素会被过滤掉。代码如下:
result=''for r,g,b,i in data:
if r==g and g==b:
result+=chr(r)print result
我们在保留像素的同时,已经利用chr函数将其转化成对应的ASCII了,此时得到的结果是:
ssssssmmmmmmmaaaaaaarrrrrrrttttttt ggggggguuuuuuuyyyyyyy,,,,,,, yyyyyyyooooooouuuuuuu mmmmmmmaaaaaaadddddddeeeeeee iiiiiiittttttt....... ttttttthhhhhhheeeeeee nnnnnnneeeeeeexxxxxxxttttttt llllllleeeeeeevvvvvvveeeeeeelllllll iiiiiiisssssss [[[[[[[111111100000005555555,,,,,,, 111111111111110000000,,,,,,, 111111111111116666666,,,,,,, 111111100000001111111,,,,,,, 111111100000003333333,,,,,,, 111111111111114444444,,,,,,, 111111100000005555555,,,,,,, 111111111111116666666,,,,,,, 111111122222221111111]]]]]]]]
我们仔细观察一下,发现除了开头的s外,其他字母都重复了7次,我们来简单地处理一下,代码如下:
i=0out=''while i<len(result):out+=result[i]i+=7print out
得到的结果是:
smart guy, you made it. the next level is [105, 110, 116, 101, 103, 114, 105, 116, 121]
我们再利用上面的方法将[105, 110, 116, 101, 103, 114, 105, 116, 121]转换一下,得到最终结果:
integrity
我们尝试着访问http://www.pythonchallenge.com/pc/def/integrity.html 成功进入第8题。Fighting!!!
必须强调的一点是如果在获取像素列表之后,利用去掉重复值的方法来处理数据,得到的结果是不正确的,最后得到的list是[105, 10, 16, 101, 103, 14, 105, 16, 121],其中重复的1都被删除了一个,这样的结果是错误的。