最近看到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文件。
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头文件的相关说明。
import re
re_jpg = re.compile(r'(.{6}JFIF(.(?!(.{5}JFIF)))*)', re.M|re.S)
swf = open('test.swf', 'rb')
cnt = 0
for jpg in re_jpg.findall(swf.read()):
f = open('%d.jpg' % cnt, 'wb')
cnt += 1
f.write(jpg[0])
f.close()
运行程序我们便得到了所有的小碎片。
这里我们用到了一个小trick,就是只要图片文件正确,我们向后面添加多余内容,不影响图片的正常解析,所以有的加密软件就是帮你把秘密添加到某个图片的后面,这样外表看上去是图片。
我们发现小图片竟然都是正方形的,而且竟然都是按照顺序给的,那么剩下的工作就很简单了,用PIL把图片拼起来就好了。注意PIL的(0,0)点是左上角,并且(x,y)是先第x列第y行的意思,这里经常容易出错。
from PIL import Image, ImageDraw
total = 36
row = 6
col = 6
w = 60
h = 60
im = Image.new('RGB', (w*col, h*row))
draw = ImageDraw.Draw(im)
for i in range(row):
for j in range(col):
now = Image.open('%d.jpg' % (i*col+j))
for x in range(h):
for y in range(w):
draw.point((j*h+x, i*w+y), now.getpixel((x, y)))
im.save('test.jpg')
图片生成后是这个样子
很奇怪啊,我们再仔细观察发现原来图片是有重叠的,于是我们只要拿每张图片的右下角的1/4来组成就可以了,于是最后我们就完成了最后的拼图。
之前还有人跟我说,flash生成swf来做网页绝对安全。。。
@Vespa: 相对来说比较安全吧。。。看到infoq以前的slides也是弄成swf。。。
你好,为啥我用您的方法得到的swf文件,用编辑器打开后是乱码呢?
UltraEdit打开的
@FlyChou: 没错,打开就是乱码,仔细观察乱码会发现里面有“CREATOR: gd-jpeg v1.0 (using IJG JPEG v62)”这样的字样
为啥我下载到的拼图的flash文件打开是白版。。。文件体积大小也不对(太小了。还有你这个方法是基于Python运行的么?电脑小白求教,接触Python很浅。。搞这个只是为了玩论坛.
@yswysc: 是基于python的,由于要处理图片需要装PIL这个库,需要网上搜下怎么弄
@isnowfy: 试过了。。第一个代码的re_jpg = re.compile(r'(.{6}JFIF(.(?!(.{5}JFIF)))*)’, re.M|re.S)
(r'(是不是要把r改成b
而且pil怎么都装不上,无论是win还是Linux,win用的是Python2.7
@isnowfy: 在Linux上成功的还原出了test图片,可是原图怎么弄啊。。。windows上pil依旧安装不上去,说什么找不到Python2.7
@isnowfy: 经过努力,在Linux上做出了完美还原原图的脚本,只是windows卡在了pil安装不了的问题上
@yswysc: 赞!确实在win下可能有点问题
@isnowfy: 这是提取出来的图片直接还原的脚本
#script made by lee
#请自行修改相关数据
from PIL import Image, ImageDraw
folder=’Photo’ #把提取出来的图片放入名为Photo的文件夹内,并把此脚本置于同一目录之下
row = 11 #图片行数
col = 19 #图片列数
w = 60 #图片宽度
h = 60 #图片高度
im = Image.new(‘RGB’, (int(w*col*.5), int(h*row*.5)))
draw = ImageDraw.Draw(im)
for i in range(row):
for j in range(col):
now = Image.open(‘%s/%d.jpg’ % (folder, i*col+j))
for x in range(int(h*.5), h):
for y in range(int(w*.5), w):
draw.point((j*int(h*.5)+(x-int(h*.5)), i*int(w*.5)+(y-int(w*.5))), now.getpixel((x, y)))
im.save(‘finish.jpg’) #图片将会保存为名为Finish.jpg的文件
话说站长你这网站几乎没什么人流量了啊。。
@yswysc: 哎是呢,毕竟两年没写新文章了。。
@isnowfy: windows也解决了。。可以用pillow这个库来代替PIL库实现脚本的运行
站长 我是才看到的很想学习 现在只是把test.swf 下载下来打开了现在有几问题想问你下 1. 你后面的代码是用Python的集成环境来编写的吗 ?2.有什么推荐的集成环境吗 比如自带你所说的pillow这个库的 3。后面的过程是把图片提取出来 在编写一个脚本来实现在网站上还原图片吗 ?
还好吧
sample-paper.com
Our objective would be to cater the requirements of people of all age groups as we intend to publish news classified into General, sample-paper.com Political, Crime, Sports, Entertainment, Education and World News.Our reporting team intends to publish the Education & Recruitment Update for all age groups and present the true picture of the recent events with the inside coverage.