Archive for March, 2007

聊聊图片验证

2007-3-27 21:23 | by 2ndboy

  昨天为了实现一个很好玩的应用而不得不花将近两个小时的时间破解了一个网站的登录图片验证,现记录心得如下:)

  这个图片验证属于特别规整的那种,除了在背景上加了些跟文字同色的干扰点之外,内容全部为数字,数字的颜色固定,数字的位置固定,数字本身没有经过变形,所以特别容易下手:)

  识别图片中的文字首先肯定要排除干扰因素,一开始想到了一种方法——扫描图片,去掉面积小于 3 的色块(把一个象素点的面积算作 1)。其实基本上这种办法是完全可行的,因为数字的笔划都是连续的,所以面积肯定不小,这样一来面积小的色块就一定是干扰点啦。但是对于跟数字连在一起的干扰点,这种方法无效。去掉干扰点之后就可以通过取一些特征点判断出是那个数字了。

  但是后来想到的另外一种更简单有效的方法立刻让我打消了实现上述方法的念头。那就是:取到所有 10 个数字的字模(点阵信息)保存在程序里,之后把每一个待识别数字跟字模进行比较,只要其中任何一个象素不符合就表示不是这个数字。这样一来就根本不用管图片上的干扰点啦:D

  由于认证图片中的数字位置固定,所以可以先多保存几个认证图片,用程序把每个数字单独切分保存。当积累到一定数量的样本之后就可以采集字模啦(我每个数字采集了 4 张样本图)。

  取字模也用程序实现,只要挨个扫描样本,取前景色象素的交集就可以得到字模。现在取到了字模,图片中每个数字的位置又是固定的,只要按照上面说的思路写段非常简单的图片跟字模比较的代码就可以实现认证图片识别啦(完全不用管图片中的干扰点!)。程序写好后做了一下测试,可以百分之百识别该网站认证图片中的内容,哈哈!

  从这个破解过程中得到一些关于好的认证图片生成算法的特征:
* 文字颜色、干扰颜色跟背景颜色要随机产生
* 文字位置和文字间距也要随机调整
* 文字要做旋转和变形
* 如果用汉字的话,效果会更好:)(当然,不适用于国际化网站)

  做了如上处理的认证图片,基本上应该是很难被程序识别啦,除非你用那些深奥如模式识别或者什么神经网络算法吧?!这里有个例子,不知是真是假:)

介绍两个 2D 图形库

2007-3-23 21:40 | by 2ndboy

  最近的项目需要找到一款跨平台的 2D 图形库,最好能在使用接口上兼容 MicroSoft 的 GDI+,经过一番搜寻跟对比,总结了一些这方面的信息放在这里做个笔记。

  首先介绍一下 Cairo 库,没听说过没关系,FireFox 总听说过吧?!FireFox 的 render 引擎用的就是这个库。Cairo 是一个跨平台的 2D 图形库,支持很多 GDI+ 的高级特性,比如 Anti-alias,矩阵变换等等,但是据说 Cairo 的效率不是很好,跟其它库有一定的差距。

  用 Cairo 最爽的地方在于有个跟它相配合的 libGDIPlus 库,这个库对 Cairo 进行了封装,对外提供了一个 GDI+ Flat API 兼容的使用接口,这样就为把 Windows 平台下的 GDI+ 代码移植到 Unix 或者 Mac 平台下提供了一条捷径。

  下面要介绍的是 AGG(Anti-Grain Geometry),这个库貌似效率很好,可以去它的 Demo 展示页面去看看,里面的小例子都非常的酷!

  AGG 也有一个类似于 libGDIPlus 那样的封装,叫做 AggPlus。但是美中不足的是 AggPlus 对 GDI+ 接口的封装充其量只实现了 20%,基本上没有实用价值,但是拿来跟 GDI+ 做性能比较测试还是比较方便的。其实在 AggPlus 的下载包里面就有这么个性能测试程序,在某些基本图形的 render 测试中 AGG 居然比 GDI+ 快 10 倍以上!

  Cairo 跟 AGG 都是非常不错的 2D 图形库,虽然我始终没办法在 Cairo 跟 AGG 之间做性能测试,但是貌似 AGG 比 Cairo 的性能要好;在特性方面,他俩似乎不分伯仲,GDI+ 1.0 里有的 feature 几乎都能在这两个库里找到对应物;在 interface 方面,Cairo + libGDIPlus 是一对黄金搭档,只要你熟悉 GDI+ 的 Flat interface,很快就能把 Cairo 加到自己的项目里面;AGG 的 interface 比较另类,完全基于 C++ Template 写就,基本上属于看了文档还感觉很晕的那种,有人说要想把 AGG 用起来,要有比较好的图形学知识,深以为然!

  从跨平台和编译上比,AGG 全面胜出,在 Windows/Unix/Mac 三个平台下都轻松通过,Cairo 就稍差一点点,在 Windows 平台下需要经过一定的修改(当然首先要熟悉一下才能修改)。在 Windows 下编译 libGDIPlus 貌似就是不可能完成的任务,至少我花了一些时间后放弃了这个念头。

  在跟同事解释 Cairo + libGDIPlus 和 AGG 的最显著区别时我打了个比方,前者就像是一辆整装待命的国产车,后者就像是一堆精致的进口汽车配件。把前者用起来比较容易,但是可能性能一般;把后者用起来需要花很多时间,还要有专业知识,但是一旦跑起来那就很爽!

6233 入手一周记

2007-3-11 16:52 | by 2ndboy

  已经用了 5 年的阿尔卡特 OT525最近半年来键盘越来越不听使唤,于是经过一番网上筛选、看攻略等折腾,终于选定了诺基亚 6233。6233 是款 3G 手机,因此国内尚无行货销售,所以只能买水货啦,于是找到上次买水货 ThinkPad 的商家去买手机,毕竟之前打过交道还算比较放心。上周日入手一部黑色亚太版 Nokia 6233,到今天整整一周,来写写心得:)

  买手机之前其实并没有什么明确的功能需求,但是支持 Java 程序,WAP 2.0 倒是最基本的要求,不过貌似现在的诺基亚手机都支持 Java 的,所以后来感觉是在选外型一样,看来看去就选中了 6233。虽然操作系统是非智能的 S40,但是貌似反应比 S60 要好,这点挺重要,我以前的 OT525 刚买来时还不错,但是后来速度越来越慢,删除个短信都要等半天,所以这次一点要选个操作反应快点的手机,6233 在这方面很让我满意!

  6233 最出彩的地方恐怕就是她的 MP3 回放效果吧,机身两侧有一对立体声扬声器,声音超大,而且效果很不错。支持 MP3、WMA 还有 FM 收音机。

  最喜欢的是支持 Java 程序这个特性,虽然某些方面比不上 S60 系统,但是一般的游戏和应用软件跑起来是一点问题都没有,240×320 的屏幕效果不错。买了以后马上装上了金山词霸,列车时刻表等常用软件,真是方面呐!

  6233 支持红外、数据线和蓝牙。红外试了试,虽然是最方便的一种方式,但是传输速度实在是太慢。数据线插来插去不方便,于是就去买了个蓝牙适配器(我的 T60 学生机标配没有蓝牙:(),速度还算满意,70K 以上,平时用用传个 MP3 铃声什么的不在话下,如果文件太大干脆取下 TF 卡用读卡器来得最快!

  说到蓝牙,前几天发现个好玩的应用,6233 自带了一个 Wireless Presenter 程序,可以通过蓝牙遥控电脑,这时手机方向键就成了鼠标,非常有意思。要说最强的应该算是 PowerPoint 的遥控功能,不仅可以显示出 ppt 文件的每一页,随便翻页,还能查看 notes,做演示的时候超爽!

  从 Sun 的网站上下载了 Java Wireless Toolkit 2.5 for CLDC,有时间研究一下也写个 Java 手机程序玩玩:)