0%

Python Challenge攻略-11

Python PIL图像处理

关卡地址:http://www.pythonchallenge.com/pc/return/5808.html

这一关也比较简单,只有一张图片的话毫无疑问就是得对图片下手了,看到上面唯一的提示是和奇偶有关。

那么怎么把图片和奇偶结合起来呢?不用问肯定是像素上下文章。那么就得先看一下像素的排列关系了。

1
2
3
4
5
6
7
8
9
10
11
12
from PIL import Image

fp = open('data.out','w')

im = Image.open('cave.jpg')
w, h = im.size
for i in xrange(h):
for j in xrange(w):
p = (j,i)
fp.write(str(im.getpixel(p)))
fp.write('\\n')
fp.close()

这样就能把每一个像素点的信息写在这个data.out的文件里了,用文本编辑器打开一看立刻就知道是怎么回事了。

1
2
3
(0, 20, 0)(142, 180, 105)(0, 20, 0)(139, 177, 100)(0, 20, 0)(143, 180, 103)(0, 20, 0)(138, 175, 98)(0, 19, 0)(153, 186, 115)(0, 18, 0)(151, 183, 116)
(148, 186, 111)(0, 20, 0)(148, 186, 109)(0, 21, 0)(144, 181, 104)(0, 20, 0)(144, 181, 104)(0, 20, 0)(146, 180, 106)(0, 18, 0)(152, 185, 114)(0, 22, 0)
(0, 20, 0)(158, 195, 118)(0, 20, 0)(148, 185, 108)(0, 22, 0)(152, 189, 112)(0, 19, 0)(150, 184, 110)(0, 19, 0)(160, 193, 124)(0, 17, 0)(162, 192, 128)

可以看出来,奇数行的奇数点是无意义的,偶数行的偶数点是无意义的,他们有着不同的G值,也就是绿色值。但是其他的点应该是包含着信息的。

那么我们就应该把这些干扰点去掉来看一下效果,最简单的办法就是用黑色像素点把这些遮盖掉。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from PIL import Image

im = Image.open('cave.jpg')
w, h = im.size
for i in xrange(h):
for j in xrange(w):
p = (j,i)
if j % 2 == 0:
if i % 2 == 1:
im.putpixel(p,0)
else:
if i % 2 == 0:
im.putpixel(p,0)
im.show()

ok,这一下图片中隐藏的信息全部暴露了。右上角浮现出来的evil就是最终的答案。

请我喝杯奶茶

欢迎关注我的其它发布渠道