2012年3月8日星期四

长图切割 PIL实践

image

趁着之前新浪微博还没有关闭basic auth的时候,在一个图片分享微博上下了很多图。图美则美矣,可惜播放幻灯片时候这种长条图就看上去不大清爽了。

所以打算写个程序把这些图用编程手段自动分离了。

虽然上过图像处理课,但真学得一桶浆糊,脑袋里好像有边界算法这个概念,到底是怎么样的根本就没影了。只能用点笨办法了。

因为水平方向没有多图,现只考虑垂直方向的切割。思路是找出4张图的边界,即垂直方向的5个点,用红笔标出。

垂直分界点的显著特征

  • 其所在水平方向的像素值都是相同的;
  • 垂直分界点所在行与内容图的像素行不同。

从图左上开始查找分界点,根据上述两规则,找到所有分界点。

先安装Python PIL (Python包安装也太ugly了)。

上代码:

import Image

#only check the color in horizontal direction
def isInSameColor(image,y,im_width):
    original_point=image.getpixel((0,y))
    for x in range(1,im_width):
        if(original_point!=image.getpixel((x,y))):
            return False
    return True
       
def IsDiffBetween2Line(image,y1,y2,im_width):
    for x in range(im_width):
        if(image.getpixel((x,y1))!=image.getpixel((x,y2))):
            return True
    return False

def SplitImage(image,im_points,im_width,imFileName):
    filename=imFileName.split('.')[0]
    print filename
    for i in range(len(im_points)-1):       
        region=image.crop([0,im_points[i],im_width,im_points[i+1]])       
        print region.size       
        region.save(filename+'[%d].jpg'%i,'JPEG')
       

if __name__ == '__main__':
    #replace the imFileName with your own photo
    imFileName='7f9e9b4dgw1dk3y3wryrlj.jpg'
    im=Image.open(imFileName)
   
    im_width=im.size[0]
    im_height=im.size[1]
   
    #where to save boundary point in ...
    im_points=[]
   
#    print im_width,im_height
    y0=0
    for y in range(1,im_height):
        if y==im_height-1:break
        if isInSameColor(im,y0,im_width) is True:
            #compare with next line
            if IsDiffBetween2Line(im,y0,y,im_width) is True:
                im_points.append(y0)
        y0=y
   
    #append the last point
    im_points.append(im_height-1)      
    print im_points
   
    SplitImage(im, im_points, im_width, imFileName)
    print "The end!"

 

结果:

image

2012年3月7日星期三

批量下载豆瓣FM加心歌曲

 

需要的软件:

  • Excel
  • Python
  • 迅雷

 

主要流程:

1. 获得豆瓣FM加心歌曲列表:登录douban.fm,安装Chrome 插件豆瓣电台爬虫,在douban.fm页面点击插件按钮。过片刻,会有页面显示全部歌曲列表,黏贴入Excel。

Note: 使用chrome插件得到歌曲列表的好处就是不需要在client端输入用户信息,也避免了频繁basic auth,会跳出验证码的问题。

2. 使用Excel修饰歌曲列表:比如删除重复歌曲(remove duplicates),删除不需要的信息,就保留歌名,歌手,另存为dbFM.csv。

Note: 在Windows OS上,文件莫名就会被加入BOM,使用工具(e.g. Notepad++)把这个标志删了,不然运行以下程序会出错。

3. 写Python脚本生成歌曲资源信息列表:主要从ting.baidu.com上得到资源URI。程序输入为dbFM.csv;输出有两个文件,ResourceURI.txt(以.mp3结尾的URL,一行一曲),MissingList.txt(ting上不一定找得到,需要手工查找)。

Note: 最开始爬的是mp3.baidu.com,编码GBK的,崩溃。mp3和ting,功能很重叠啊,百度就不能在mp3基础上升级吗。 写这么段小程序,我深刻得感受到走上了不归路,码农!为了个白痴问题都得花很长时间去解决!!!程序写得健壮,还要考虑exception处理,网络问题,断点续读,这些通通没考虑。我离专业码农还是有差距的。

4. 使用迅雷批量下载资源:复制ResourceURI.txt内容,打开迅雷,新建,至此,终于可以批量下载了。

Note: 最好批量下载一次下完。发现要是把下载任务放在下次迅雷开启的时候,歌名会变成File(n).mp3的形式,不会自动重命名了。原因未明,但是300多首歌每首都手动重命名,这可够浪费时间的了。切忌。

5. 整个过程还是蛮繁琐的,把这些功能都集成起来也没兴趣做了。批量下载加心歌曲,估计以后不会再用了。等批量下载完,发现很多歌都不要听了,口味随时在变。倒是谁搞个批量取消加心歌曲啊。

2012年2月3日星期五

新年工作第一周

节后过来第一个礼拜,打算严肃自己,不打酱油,好好看DB中的表和存储过程的。
周一确实没有打酱油,看了这个release下别人的代码P和T。
T和现在维护的代码风格类似,很容易就能找到核心所在了。
P代码的风格太诡异,又是用MVC写的页面,实在不想看了,直接看文档了事。

周二Domain Meeting上有了新需求,从此开始,和mentor一起将近写了一个礼拜文档。傍晚发完邮件,终于松了口气。
一鼓作气把文档写完,的确对自己帮助很大。对要维护项目的业务需求印象又加深了许多。
但是要想完全掌握熟悉还需要很长的路,慢慢看DBCode,不能再觉得没事做了。
中间查询些数据,不知道查哪张表,还被mentor鄙视了。

去年7月中旬正式进入公司,也有半年多了,尽管做了几个小项目,但收获不大,一直感觉没事做。对工作确实不怎么上心,自己也没有明确的目标,酱油一瓶。
对要维护的项目本来就应该花时间看的,拖延症害死我了。

在时间管理上,把时间花在重要但不紧急的事情上是最好的,现在我才深深得体会到。
只要保持这样做,重要的事情永远不会紧急因为当它还不紧急时已经被做完了。

早上doc review匆匆准备了下,说得蛮差的,虽然说得很快,也这样过去了。
六月有出差的机会,和美国人面对面的机会,我准备好了吗,我的英语要好好加油啊。

这个礼拜也买了kindle4,快读完一本书了。
发现在阳光下看书,字依然很清晰,乘地铁闲时间过得太快了。
一直纠结该怎么样看书,花时间看一本对自己帮助不大的书会不会浪费了。
现在想,与其纠结,不如先把书整本过一遍,真的好书是值得多看几遍的。

这个礼拜很充实,虽然累,至少不彷徨。
看着别人目标明确,津津有味,向着未来努力着,心里真是羡慕。
既然找不到什么人生理想,不如把眼前的事情做好。不要再纠结了。
新年新气象。