【MISC】图片点阵提取

在打VNCTF2022的时候遇到这样一道题,图片直接放在文章肯能看不清,各位可以点开来仔细观看

放大来看

又是点阵图,这不就是妥妥的点阵提取嘛,打开画图,量出来点之间的距离,然后开造!
结果,出来很意外,每个点之间的距离都是不一样的,都在49~51之间浮动,这就导致直接提取不能提取出有效的信息
好在,每一行每一列的点都在同一条直线上,只要求出最左上角的点,然后跑出每一行每一列的坐标,再拼接即可
拼接的话可以使用OpenCV库,但是Python的PIL(Pillow)好像更胜一筹,于是学了一下写了个脚本

from PIL import Image,ImageDraw
image = Image.open("misc-img-pixel-1.png")
Line=[]
Row=[]
black=image.getpixel((0,0))
for i in range(image.height-1):
    if(image.getpixel((24,i))!=black):
        Row.append(i)
for i in range(image.width-1):
    if(image.getpixel((i,15))!=black):
        Line.append(i)
ret = Image.new('RGB', (len(Line), len(Row)) )
draw = ImageDraw.Draw(ret)
for x in range(len(Line)-1):
    for y in range(len(Row)-1):
        draw.point((x, y), fill=image.getpixel((Line[x],Row[y]))) 
ret.show()
ret.save('result.png')

果然太久没写python脚本已经生疏了,php味Python都出来了,得找个时间练一下了
对于getpixel效率不高的问题,曹佬给出了他的脚本,用load先把图片数组化再进行比较

weight, height = image.size
png = image.load()
for i in range(height):
    for j in range(weight):
        png[i, j] = (0, 0, 0, 0);

发布者

正汰

永远是这样,山前面是山,天空上面是天空,道路前面还是道路,迷茫之后还有迷茫。

发表评论

您的电子邮箱地址不会被公开。