python challenge 7 博客分类: python Python算法F#
程序员文章站
2024-02-04 11:17:58
...
第七题,画面上就一幅图,页面源码中没有任何注释之类的线索,就只有图片有点奇怪。图片的中间有一个黑白条,估计看能不能从这里入手。 于是需要PYTHON的图形处理功能,网上找了找有个PIL库,需要自行安装,能够读取图片信息,于是初步思路就是先看看那个黑白条有些什么信息再说,摸着石头过河。
本来打算遍历图片所有的像素点信息,看看处于黑白条中的像素点跟其它的像素点有没有什么不同之处,但后面查了点图形方面的资料,发现我这个想法很傻…… 还是先补点基础知识。
---------------------------------------
图片模式:
1 1位像素,黑和白,存成8位的像素
L 8位像素,黑白
P 8位像素,使用调色板映射到任何其他模式
RGB 3×8位像素,真彩
RGBA 4×8位像素,真彩+透明通道
CMYK 4×8位像素,颜色隔离
YCbCr 3×8位像素,彩色视频格式
I 32位整型像素
F 32位浮点型像素
RGB
---------------------------------------
看到网上有人用GIMP,我也安装一个。打开那幅图片,找到黑白条所在的像素区域,将黑白条剪切出来。
程序输出:
mode: RGBA
amount of pixel: 5472
(115, 115, 115, 255)
看来这幅图是RGBA模式,黑白条区域共有5472个像素点,第一个像素点的R,G,B,A的值分别为115,115,115,255。
读取图片信息的目的达到了,但怎样从这些信息中获得过关信息呢? 现在图片模式是RGBA-24位,如果是L-8位的话,就可以将每个像素转成ASCII码。PIL可以转换图片模式。于是增加代码:
输出结果:
smart guy, you made it. the next level is [105, 110, 116, 101, 103, 114, 105, 116, 121]
(最开始就是使用了去掉重复值的算法,导致读出来的数字不正确。110变成了10,116变成了16)
这一组数字处于ASCII码中的字母区域,于是转成ASCII码。增加代码:
输出:integrity 就是它了!
通过做这题让我学习到了图片的一些基础知识,PIL库中Image模块的简单使用。
本来打算遍历图片所有的像素点信息,看看处于黑白条中的像素点跟其它的像素点有没有什么不同之处,但后面查了点图形方面的资料,发现我这个想法很傻…… 还是先补点基础知识。
---------------------------------------
图片模式:
1 1位像素,黑和白,存成8位的像素
L 8位像素,黑白
P 8位像素,使用调色板映射到任何其他模式
RGB 3×8位像素,真彩
RGBA 4×8位像素,真彩+透明通道
CMYK 4×8位像素,颜色隔离
YCbCr 3×8位像素,彩色视频格式
I 32位整型像素
F 32位浮点型像素
RGB
---------------------------------------
看到网上有人用GIMP,我也安装一个。打开那幅图片,找到黑白条所在的像素区域,将黑白条剪切出来。
import Image if __name__ == '__main__': img = Image.open('7.png') #left,top,right,bottom box = (0, 43, 608, 52) belt = img.crop(box) #get a sequence object containing pixel values pixels = belt.getdata() print('mode: %s' % img.mode) print('amount of pixel: %d' % len(pixels)) print(pixels[0])
程序输出:
mode: RGBA
amount of pixel: 5472
(115, 115, 115, 255)
看来这幅图是RGBA模式,黑白条区域共有5472个像素点,第一个像素点的R,G,B,A的值分别为115,115,115,255。
读取图片信息的目的达到了,但怎样从这些信息中获得过关信息呢? 现在图片模式是RGBA-24位,如果是L-8位的话,就可以将每个像素转成ASCII码。PIL可以转换图片模式。于是增加代码:
import Image if __name__ == '__main__': img = Image.open('7.png') #left,top,right,bottom box = (0, 43, 608, 52) belt = img.crop(box) #get a sequence object containing pixel values pixels = belt.getdata() print('mode: %s' % img.mode) print('amount of pixel: %d' % len(pixels)) print(pixels[0]) #convert mode RGBA to mode L lBelt = belt.convert('L') #get a sequence object containing pixel values lPixels = lBelt.getdata() #黑白条中的像素点有规律:每一行的像素点都是一样的,并且一行中也有相同的像素。 #但有一点不好处理的是:字母间可以通过能否组成单词来判断是否有重复值,但数字 #就不能通过这种方法来判断了 str = [] #step 7是通过试验出来的 for i in range(0, 608, 7): str.append(chr(lPixels[i])) x = lPixels[i] print(''.join(str))
输出结果:
smart guy, you made it. the next level is [105, 110, 116, 101, 103, 114, 105, 116, 121]
(最开始就是使用了去掉重复值的算法,导致读出来的数字不正确。110变成了10,116变成了16)
这一组数字处于ASCII码中的字母区域,于是转成ASCII码。增加代码:
result = [105, 110, 116, 101, 103, 114, 105, 116, 121] print(''.join(chr(x) for x in result))
输出:integrity 就是它了!
通过做这题让我学习到了图片的一些基础知识,PIL库中Image模块的简单使用。
推荐阅读
-
python challenge 8 博客分类: python PythonHTML
-
python challenge 5 博客分类: python PythonF#
-
python challenge 10 博客分类: python Python
-
python challenge 7 博客分类: python Python算法F#
-
python challenge 9 博客分类: python Python360J#
-
python challenge 11 博客分类: python Python
-
python challenge 7 博客分类: python Python算法F#
-
python challenge 6 博客分类: python PythonOOAIR网页游戏游戏
-
python challenge 4 博客分类: python PythonPHPJavaScriptF#HTML
-
python语法学习整理 博客分类: Python