一种图形验证码生成方法转让专利

申请号 : CN201110234417.0

文献号 : CN102360505B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 蔡良木

申请人 : 北京新媒传信科技有限公司

摘要 :

本发明公开了一种图形验证码生成方法。包括:准备多个字符集;计算每个字符集中的每个字符在不同字体大小和不同格式下的字符宽度值W、字符高度值H、字符本身的左边距L和字符本身的上边距T;从所述多个字符集中选择一个字符集,从中择预设个数的字符,得到集合S;根据画布的高度和所选择字符集的字体大小配置范围确定输出字体大小;在画布上以所述确定的输出字体大小依次输出集合S中的各字符,其中,在输出每个字符时:先确定当前输出字符的背景左边距BL和背景上边距BT,然后根据该字符的W、H、L、T、BL和BT在画布上输出该字符。本发明的技术方案,能够生成清晰匀称的验证码,降低了用户的输错几率,减轻了服务器的压力。

权利要求 :

1.一种图形验证码生成方法,其特征在于,该方法包括:准备多个字符集;

计算所述多个字符集中的每个字符集中的每个字符在不同字体大小和不同格式下的大小参数,并保存;所述大小参数包括:字符宽度值W、字符高度值H、字符本身的左边距L和字符本身的上边距T;

从所述多个字符集中选择一个字符集,从选择的字符集中随机选择预设个数的字符,得到字符的集合S;

根据画布的高度和所选择字符集的字体大小配置范围确定输出字体大小;

在画布上以所述确定的输出字体大小依次输出集合S中的各字符,其中,在输出每个字符时:先确定当前输出字符的背景左边距BL和背景上边距BT,然后左侧从BL-L的位置开始,上侧从BT-T的位置开始输出该字符;

其中,BL是字符与画布左边缘之间的距离;BT是字符与画布上边缘之间的距离。

2.根据权利要求1所述的方法,其特征在于,计算所述多个字符集中的每个字符集中的每个字符在不同字体大小和不同格式下的大小参数包括:遍历所述多个字符集中的每个字符集中的每个字符的不同字体大小和不同格式,对于每个指定了字体大小和格式的字符执行一下步骤:在纯色的背景画布上的顶着该画布的左上角输出指定颜色的该字符,该字符的颜色与背景画布的颜色不同;通过从左到右,从上到下的顺序依次提取背景画布上的每个像素,并比较其颜色,确定该字符的W、H、L和T参数。

3.根据权利要求1所述的方法,其特征在于,该方法进一步包括:为所述多个字符集中的每个字符集设置高度比;

所述根据画布的高度和所选择字符集的字体大小配置范围确定输出字体大小包括:令MaxFontSize=[(画布高度-预设上边距)/所选择字符集的高度比]下取整;其中,[]下取整为向下取整函数;

令MinFontSize=[MaxFontSize-第一预设值,所选择字符集配置的最小字体]MAX;[]MAX为选取最大值函数;

从MinFontSize到MaxFontSize的范围内选择一种字体大小作为输出字体大小。

4.根据权利要求3所述的方法,其特征在于,

所述预设上边距等于3个像素点的高度和;

所述第一预设值等于4个像素点的高度和。

5.根据权利要求3所述的方法,其特征在于,所述确定当前输出字符的背景左边距BL包括:对于输出的第一个字符,其背景左边距BL取第二预设值;

对于后续输出的字符,其背景左边距BL根据所述第二预设值、已输出字符的宽度总和以及字符之间增加的间距常量确定。

6.根据权利要求5所述的方法,其特征在于,

所述第二预设值取5个像素点的宽度和与10个像素点的宽度和之间的值。

7.根据权利要求3所述的方法,其特征在于,所述确定当前输出字符的上边距BT包括:令Maxheight=画布高度-当前输出字符的高度值H-第三预设值;

令X=[Maxheight,第三预设值]MAX;[]MAX为选取最大值函数;

从第三预设值/2到X/2的范围内选取一个随机数作为BT。

8.根据权利要求7所述的方法,其特征在于,

所述第三预设值等于6个像素点的高度和。

9.根据权利要求1所述的方法,其特征在于,该方法进一步包括:为每个字符集中的每个字符确定其对应的放大因子;

对于集合S中的每个字符:最终输出字体大小=所述确定的输出字体大小×该字符的放大因子;

所述在画布上以所述确定的输出字体大小依次输出集合S中的各字符为:在画布上以对应的最终输出字体大小输出集合S中的各字符。

说明书 :

一种图形验证码生成方法

技术领域

[0001] 本发明涉及互联网应用技术领域,特别是涉及一种图形验证码生成方法。

背景技术

[0002] 当前,在互联网应用中,很多网站为了防止用户利用机器人进行自动注册、登录、灌水等,都采用了图形验证码技术。所谓图形验证码就是将一串随机产生的数字或字符,生成一幅图片,图片里还可以加上一些干扰像素,由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。
[0003] 目前普遍生成图形验证码的方法是:产生一个随机字符串,将此字符串存到内存中,将此字符串生成图片显示给用户,用户根据图片识别字符串并进行输入提交,服务器用内存中的字符串和用户输入的字符串进行对比,一致则表示验证通过。
[0004] 但是现有的从不同字符集生成图形验证码输出的方法,或者设置不同字体大小、旋转、粗体或斜体等格式的图形验证码输出方法,都存在字符重叠、模糊、或大或小等问题,即生成的图形验证码比较粗糙,造成用户识别困难,进而输入错误的几率比较大,造成很多不必要的网络流量和服务器的压力。

发明内容

[0005] 本发明提供了一种图形验证码生成方法,该方法能够生成清晰匀称的验证码,降低了用户的输错几率,减轻了服务器的压力。
[0006] 为达到上述目的,本发明的技术方案是这样实现的:
[0007] 本发明公开了一种图形验证码生成方法,该方法包括:
[0008] 准备多个字符集;
[0009] 计算所述多个字符集中的每个字符集中的每个字符在不同字体大小和不同格式下的大小参数,并保存;所述大小参数包括:字符宽度值W、字符高度值H、字符本身的左边距L和字符本身的上边距T;
[0010] 从所述多个字符集中选择一个字符集,从选择的字符集中随机选择预设个数的字符,得到字符的集合S;
[0011] 根据画布的高度和所选择字符集的字体大小配置范围确定输出字体大小;
[0012] 在画布上以所述确定的输出字体大小依次输出集合S中的各字符,其中,在输出每个字符时:先确定当前输出字符的背景左边距BL和背景上边距BT,然后根据该字符的W、H、L、T、BL和BT在画布上输出该字符;
[0013] 其中,BL是字符与画布左边缘之间的距离;BT是字符与画布上边缘之间的距离。
[0014] 在上述方法中,计算所述多个字符集中的每个字符集中的每个字符在不同字体大小和不同格式下的大小参数包括:
[0015] 遍历所述多个字符集中的每个字符集中的每个字符的不同字体大小和不同格式,对于每个指定了字体大小和格式的字符执行一下步骤:在纯色的背景画布上的顶着该画布的左上角输出指定颜色的该字符,该字符的颜色与背景画布的颜色不同;通过从左到右,从上到下的顺序依次提取背景画布上的每个像素,并比较其颜色,确定该字符的W、H、L和T参数。
[0016] 该方法进一步包括:为所述多个字符集中的每个字符集设置高度比;
[0017] 所述根据画布的高度和所选择字符集的字体大小配置范围确定输出字体大小包括:
[0018] 令MaxFontSize=[(画布高度-预设上边距)/所选择字符集的高度比]下取整;其中,[]下取整为向下取整函数;
[0019] 令MinFontSize=[MaxFontSize-第一预设值,所选择字符集配置的最小字体]MAX;[]MAX为选取最大值函数;
[0020] 在MinFontSize到MaxFontSize的范围内选择一种字体大小作为输出字体大小。
[0021] 所述预设上边距等于3个像素点的高度和;
[0022] 所述第一预设值等于4个像素点的高度和。
[0023] 在上述方法中,所述确定当前输出字符的背景左边距BL包括:
[0024] 对于输出的第一个字符,其背景左边距BL取第二预设值;
[0025] 对于后续输出的字符,其背景左边距BL根据所述第二预设值、已输出字符的宽度总和以及在字符之间增加的间距常量确定。
[0026] 所述第二预设值取5个像素点的宽度和与10个像素点的宽度和之间的值。
[0027] 在上述方法中,所述确定当前输出字符的上边距BT包括:
[0028] 令Maxheight=画布高度-当前输出字符的高度值H-第三预设值;
[0029] 令X=[Maxheight,第三预设值]MAX;[]MAX为选取最大值函数;
[0030] 从第三预设值/2到X/2的范围内选取一个随机数作为BT。
[0031] 所述第三预设值等于6个像素点的高度和。
[0032] 该方法进一步包括:为每个字符集中的每个字符确定其对应的放大因子;
[0033] 对于集合S中的每个字符:最终输出字体大小=所述确定的输出字体大小×该字符的放大因子;
[0034] 所述在画布上以所述确定的输出字体大小依次输出集合S中的各字符为:在画布上以对应的最终输出字体大小输出集合S中的各字符。
[0035] 在上述方法中,所述根据该字符的W、H、L、T、BL和BT在画布上输出该字符包括:
[0036] 左侧从BL-L的位置开始,上侧从BT-T的位置开始输出该字符。
[0037] 由上述可见,本发明这种准备多个字符集,计算所述多个字符集中的每个字符集中的每个字符在不同字体大小和不同格式下的大小参数并保存;所述大小参数包括:字符宽度值W、字符高度值H、字符本身的左边距L和字符本身的上边距T;从所述多个字符集中选择一个字符集,从选择的字符集中随机选择预设个数的字符,得到字符的集合S;根据画布的高度和所选择字符集的字体大小配置范围确定输出字体大小;在画布上以所述确定的输出字体大小依次输出集合S中的各字符,其中,在输出每个字符时:先确定当前输出字符的背景左边距BL和背景上边距BT,然后根据该字符的W、H、L、T、BL和BT在画布上输出该字符的技术方案,能够生成清晰匀称的验证码,降低了用户的输错几率,减轻了服务器的压力。

附图说明

[0038] 图1是本发明实施例中的一种图形验证码生成方法的流程图。

具体实施方式

[0039] 本发明的核心思想是:准备需要使用的不同字符集,采集不同字符集各种格式下(比如字体大小,粗体等)的字符宽度Width(后续用W表示)和字符高度Height(后续用H表示),以及字符本身的横向距离Left(后续用L表示)和纵向距离Top(后续用T表示),在进行图形验证码输出时,根据所采用的背景画布的大小以及具体采用那种字符集和输出的字符个数,动态计算此批字符整体采用的字体大小,然后在背景画布逐字符输出。
[0040] 为了使本发明的目的、技术方案和优点更加清楚,下面结合附图和具体实施例对本发明进行详细描述。
[0041] 图1是本发明实施例中的一种图形验证码生成方法的流程图。如图1所示,该方法包括:
[0042] 101,准备多个字符集。
[0043] 102,计算所述多个字符集中的每个字符集中的每个字符在不同字体大小和不同格式下的大小参数,并保存;所述大小参数包括:字符宽度值W、字符高度值H、字符本身的左边距L和字符本身的上边距T。
[0044] 103,从所述多个字符集中选择一个字符集,从选择的字符集中随机选择预设个数的字符,得到字符的集合S。
[0045] 104,根据画布的高度和所选择字符集的字体大小配置范围确定输出字体大小。
[0046] 105,在画布上以所述确定的输出字体大小依次输出集合S中的各字符,其中,在输出每个字符时:先确定当前输出字符的背景左边距BL和背景上边距BT,然后根据该字符的W、H、L、T、BL和BT在画布上输出该字符。
[0047] 其中,BL是字符与画布左边缘之间的距离;BT是字符与画布上边缘之间的距离。
[0048] 图1所示的技术方案,能够生成清晰匀称的验证码,降低了用户的输错几率,减轻了服务器的压力。
[0049] 下面图1所述的技术方案详细描述如下:
[0050] 1、准备多个字符集。例如,Alias、Papyrus、Georgia。
[0051] 2、为所准备的多个字符集选择字符的限定范围。例如在本发明的一个实施例中:Alias采用数字和字母结合,Papyrus采用数字和字母结合,并且采用粗体,要求能够旋转,而Georgia只要支持数字就行。
[0052] 3、计算所述多个字符集中的每个字符集中的每个字符在不同字体大小和不同格式下的字符宽度值W、字符高度值H、字符本身的左边距L和字符本身的上边距T。
[0053] 这里字符本身的左边距L和字符本身的上边距T是在画布上输出该字符是,其本身具有的边距。例如当顶着(即不留边距)画布的左边缘输出该字符时,其在左边还是会有一定的边距,该边距即为L。同样当顶着画布的上边缘输出该字符时,其在上边也会有一定的边距,该边距即为T。
[0054] 本发明中事先记录字符本身的上边距T和左边距L的目的就是为了消除字符输出时,其本身带来的边缘。后续会介绍如何利用L和T。
[0055] 在本发明的一个实施例中的计算字符宽度值W、字符高度值H、字符本身的左边距L和字符本身的上边距T的方式为:遍历所准备的多个字符集中的每个字符集中的每个字符的不同字体大小和不同格式(如粗体,斜体等),对于每个指定了字体大小和格式的字符执行以下步骤:
[0056] 3.1、在纯色的背景画布上的顶着该画布的左上角(即顶着左边缘和上边缘)输出指定颜色的该字符,该字符的颜色与背景画布的颜色不同;例如背景画布选择白色,字符选择黑色。
[0057] 3.2、通过从左到右,从上到下的顺序依次提取背景画布上的每个像素,并比较其颜色,确定该字符的W、H、L和T参数。
[0058] 例如,根据画布的长度和宽度进行for循环,提取每个像素上的颜色,如果是黑色说明是字体输出的边界或者范围内,通过此种方式,确定画布上携带黑颜色的长宽上的边界,从而计算出此字体的L、T、W、H。
[0059] 3.3、为所准备的多个字符集中的每个字符集设置高度比。
[0060] 这是由于有的字符集的字符会修长一些,有的字符集的字符会扁平一些,根据经验设置不同的字符集高度比HeightRate。例如在本发明的实施例中,设置字符集Alias的高度比HeightRate=1.3f;Papyrus的HeightRate=2f;Georgia=1.7f。
[0061] 3.4、此外,为每个字符集中的每个字符确定其对应的放大因子。
[0062] 这是因为,同一种字符集下同一号字体下,可能有的字符偏大,有的字符偏小,这样造成采用同一字符集下的同一号字体时有的字符大有的字符小,造成视觉上的一些偏差。所以本发明中对同一字符集下某些特殊字体采用一个放大因子SizeRate,对于同一号字体如果它偏小则乘这个因子,用一个偏大的字体来画此字符。举例来说:比如Alias字符集下字符r,我们选SizeRate=1.5f;Papyrus字符集下字符a,我们选SizeRate为2f;我们采用此原则,对一些字符字体进行放大或者缩小,如果不需要进行缩放,则SizeRate为f。
[0063] 3.5、将上述参数和数据保存到缓存中。
[0064] 4、生成图形验证码的环节包括以下步骤:
[0065] 4.1、从所述多个字符集中选择一个字符集,从选择的字符集中随机选择预设个数的字符,得到字符的集合S。
[0066] 本步骤中,根据配置决定采用哪种字符集,从所采用的字符集中随机选择字符,字符个数根据配置决定,选择出的字符的集合为S。
[0067] 4.2、确定图形验证码的输出字体大小。
[0068] 在本发明实施例中通过如下方式确定要输出的图形验证码的大小:
[0069] 令MaxFontSize=[(画布高度-预设上边距)/所选择字符集的高度比]下取整;其中,[]下取整为向下取整函数;
[0070] 令MinFontSize=[MaxFontSize-第一预设值,所选择字符集配置的最小字体]MAX;[]MAX为选取最小值函数;
[0071] 在MinFontSize和MaxFontSize范围内选择一种字体大小作为输出字体大小。
[0072] 上述预设上边距可以等于3个像素点的高度和;上述第一预设值等于4个像素点的高度和。即取画布高度减去3再除以该字符集的高度比的结果向下取整的数值作为MaxFontSize,取MaxFontSize减去4和该字符集配置的最小字体中的较大者为MinFontSize。
[0073] 4.3、对于输出的第一个字符,其背景左边距BL取第二预设值。例如,该第二预设值取5个像素点的宽度和与10个像素点的宽度和之间的值。
[0074] 对于后续输出的字符,其背景左边距BL根据所述第二预设值、已输出字符的宽度总和以及字符之间增加的间距常量确定。如果不增加间距常量,则后一字符是紧挨着前一字符输出的,例如,第一字符的BL取6个像素点的宽度和,则第二个字符的BL是6个像素点的宽度和加上第一个字符的宽度值。当然,字符和字符之前的间距控制和是否增加干扰线都可以根据实际情况而定。
[0075] 对于每个输出的字符,其BT都是一样的,具体确定BT的方式如下:
[0076] 令Maxheight=画布高度-当前输出字符的高度值H-第三预设值;
[0077] 令X=[Maxheight,第三预设值]MAX;[]MAX为选取最大值函数;
[0078] 从第三预设值/2到X/2的范围内选取一个随机数作为BT,即从〔第三预设值/2,X/2〕范围内选择一个数值。
[0079] 在本发明的一个实施例中,所述第三预设值等于6个像素点的高度和。
[0080] 此外,如果 当前要输出 的字符有 特定的放 大因子SizeRate,则令FontSize=FontSize×SizeRate,如果得出的FontSize不是整数,则向下取整。即对于集合S中的每个字符:最终输出字体大小=步骤4.2中确定的输出字体大小×该字符的放大因子;在画布上以对应的最终输出字体大小输出集合S中的各字符。
[0081] 4.4、接着开始在背景画布上逐个输出集合S中的字符。具体在输出每个字符时,要考虑字符本身的边距L和T,即左侧从BL-L的位置开始,上侧从BT-T的位置开始输出该字符。
[0082] 正如前面所述,在输出过程中考虑首字符的BL,接下来输出字符控制和上一个输出字符之间的距离就可以了,一般这个距离考虑上个字符的宽度以及是否增加字符和字符之间的间距常量就可以了。至于和BT的计算方法都是一样的。其中字符的宽度可能会需要旋转而会有所增大或者减少,此计算方法考虑弧度计算,此处不再赘述。
[0083] 例如,首个输出的字符为‘E’,其BL=7、BT=6、L=1、T=2,则画该字符时的边距取:BL-L=6和BT-T=4,也就是说从画布的左边缘距离6个像素点的位置,以及从画布的上边缘距离4个像素点的位置开始画该字符‘E’。由于字符‘E’本身具有左边距L=1,上边距T=2,因此实际画出字符‘E’后,其实际视觉边距仍为7(左边)和6(上边)。
[0084] 4.5、通过上述步骤的精心控制,最终输出的字符往往字体匀称,无重叠,可视性大大增强。
[0085] 综上所述,本发明的技术方案存在以下优点:
[0086] (1),可以根据不同的业务场景选择不同的字符集以及格式进行图形验证码输出;
[0087] (2),产生的图形验证码字符清晰,高度和宽度以及字符间距都很匀称,图形验证码的质量明显提高;
[0088] (3),用户根据下发的图形验证码输入字符的正确率得到了提高,进而减轻了服务器的压力。
[0089] 以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。