IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    程序解决flash-gear的拼图问题

    isnowfy发表于 2014-03-04 11:02:54
    love 0

    2014-03-04 18:42:41的屏幕截图

    最近看到flash-gear上你可以上传图片,然后自动帮你生成拼图,而且还能选择块的大小,话说,如果块很小,人力去拼图还真有些崩溃,于是本着geek的原则,打算用程序来搞一搞。

    首先我上传了图片生成了这个拼图,就是上面的那个图片的样子,然后我们可以看到有很多小碎片,而且是慢慢出现的,于是我就考虑是不是通过网络来请求的呢,于是用了chrome的审查元素,发现没有多与的http请求,于是我又想会不会是flash通过tcp请求来获得的呢,于是用了wireshark抓包,发现依然毫无所获,看来应该是图片都已经存储在flash文件里了。审查元素可以看到 http://three.flash-gear.com/npuz/puz.php?c=z&o=2&id=3986907&k=72291300&s=30&w=180&h=180&f_dm=three 这个请求的时间最长了,于是猜测这个应该是小碎片的flash文件,于是用下面的命令我们可以得到这个flash文件。

    1. wget "http://three.flash-gear.com/npuz/puz.php?c=z&o;=2&id;=3986907&k;=72291300&s;=30&w;=180&h;=180&f;_dm=three" -O test.swf

    ok,文件得到了,打开看看吧,发现这个文件只是简单的把小碎片放到里面,用文本编辑器打开这个文件,发现里面有大量的“CREATOR: gd-jpeg v1.0 (using IJG JPEG v62)”这样的字样,这篇文章里有介绍swf的格式,和如何从swf文件取出图片,其实我们不用这么麻烦,既然图片都是直接包装在里面的,那么我们可以直接用正则取出图片。在这里可以看到jpeg头文件的相关说明。

    1. import re
    2. re_jpg = re.compile(r'(.{6}JFIF(.(?!(.{5}JFIF)))*)', re.M|re.S)
    3. swf = open('test.swf', 'rb')
    4. cnt = 0
    5. for jpg in re_jpg.findall(swf.read()):
    6. f = open('%d.jpg' % cnt, 'wb')
    7. cnt += 1
    8. f.write(jpg[0])
    9. f.close()

    运行程序我们便得到了所有的小碎片。

    2014-03-04 18:39:23的屏幕截图

    这里我们用到了一个小trick,就是只要图片文件正确,我们向后面添加多余内容,不影响图片的正常解析,所以有的加密软件就是帮你把秘密添加到某个图片的后面,这样外表看上去是图片。

    我们发现小图片竟然都是正方形的,而且竟然都是按照顺序给的,那么剩下的工作就很简单了,用PIL把图片拼起来就好了。注意PIL的(0,0)点是左上角,并且(x,y)是先第x列第y行的意思,这里经常容易出错。

    1. from PIL import Image, ImageDraw
    2. total = 36
    3. row = 6
    4. col = 6
    5. w = 60
    6. h = 60
    7. im = Image.new('RGB', (w*col, h*row))
    8. draw = ImageDraw.Draw(im)
    9. for i in range(row):
    10. for j in range(col):
    11. now = Image.open('%d.jpg' % (i*col+j))
    12. for x in range(h):
    13. for y in range(w):
    14. draw.point((j*h+x, i*w+y), now.getpixel((x, y)))
    15. im.save('test.jpg')

    图片生成后是这个样子

    test1

    很奇怪啊,我们再仔细观察发现原来图片是有重叠的,于是我们只要拿每张图片的右下角的1/4来组成就可以了,于是最后我们就完成了最后的拼图。

    test
    我猜您可能还会喜欢:

    • 关于相似图片搜索
    • python中文分词
    • 谈谈SVD和LSA
    • 几种中文分词算法的比较
    • 利用函数来画任意图形
    • wordpress防盗链
    • 自动下载豆瓣FM的加心歌曲



沪ICP备19023445号-2号
友情链接