0%

Python Challenge (Level 22)

第22关

根据Page Source里的提示,得到一张图片white.gif

这是一张动态图,基本上都是黑的像素,但标题却是white.gif. 查看一下每一帧的像素,会发现每一帧有一个值为8的像素点。动态图中,就是这个白的像素点在动,记下每一点的坐标,得到

1
2
3
4
5
6
7
8
9
10
array([[100, 100],
[100, 102],
[100, 102],
[100, 102],
[100, 102],
[100, 102],
[100, 102],
[100, 102],
[100, 102],
...

这些坐标都在(100,100)附近。结合这一关的图片上的摇杆,可以判断出这些坐标表示的是摇杆的方向,(100,100)就是原点。
得到的坐标中(100,100)出现了五次,我们可以据此将坐标分为五组,每一组画出一个图案。每画出一个图案,就要更改一下坐标位置,否则,五个图案就会重叠在一起。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from PIL import Image, ImageSequence
import numpy as np

def draw(im, origin, offsetCoords, value):
for c in offsetCoords:
im.putpixel(origin, value)
dx = (c[0] - 100) // 2
dy = (c[1] - 100) // 2
origin[0] += dx
origin[1] += dy

im = Image.open('white.gif')
coords = []
for i in ImageSequence.Iterator(im):
idata = list(i.getdata())
idx = idata.index(8)
x = idx % 200
y = idx // 200
coords.append((x, y))

coords = np.array(coords)
interval = np.where(np.all(coords == [100, 100], axis=1) == True)
interval = interval[0].tolist()
interval.append(coords.shape[0])

imOut = Image.new(im.mode, im.size)
x, y = 30, 50
for i in range(len(interval) - 1):
draw(imOut, [x, y], coords[interval[i] + 1 : interval[i+1]], 200)
x += 30
imOut.show()

得到的图片显示为bonus,http://www.pythonchallenge.com/pc/hex/bonus.html