ここの情報は古いです。ご理解頂いた上でお取り扱いください。

source: OpenPNE/trunk/lib/include/kcaptcha/kcaptcha.php @ 227

Last change on this file since 227 was 227, checked in by takanashi, 13 years ago

キャプチャ機能

File size: 6.3 KB
Line 
1<?php
2
3# KCAPTCHA PROJECT VERSION 1.2.3
4
5# Automatic test to tell computers and humans apart
6
7# Copyright by Kruglov Sergei, 2006
8# www.captcha.ru, www.kruglov.ru
9
10# System requirements: PHP w/ GD
11
12# KCAPTCHA is a free software. You can freely use it for building own site or software.
13# If you use this software as a part of own sofware, you must leave copyright notices intact or add KCAPTCHA copyright notices to own.
14# As a default configuration, KCAPTCHA has a small credits text at bottom of CAPTCHA image.
15# You can remove it, but I would be pleased if you left it. ;)
16
17# See kcaptcha_config.php for customizing
18
19class KCAPTCHA{
20
21        // generates keystring and image
22        function KCAPTCHA(){
23                require(dirname(__FILE__).'/kcaptcha_config.php');
24                $fonts=array();
25                $fontsdir_absolute=dirname(__FILE__).'/'.$fontsdir;
26                if ($handle = opendir($fontsdir_absolute)) {
27                        while (false !== ($file = readdir($handle))) {
28                                if (preg_match('/\.png$/i', $file)) {
29                                        $fonts[]=$fontsdir_absolute.'/'.$file;
30                                }
31                        }
32                    closedir($handle);
33                }       
34       
35                $alphabet_length=strlen($alphabet);
36               
37                while(true){
38                        // generating random keystring
39                        while(true){
40                                $this->keystring='';
41                                for($i=0;$i<$length;$i++){
42                                        $this->keystring.=$allowed_symbols{mt_rand(0,strlen($allowed_symbols)-1)};
43                                }
44                                if(!preg_match('/cp|cb|ck|c6|c9|rn|rm|co|do/',$this->keystring)) break;
45                        }
46               
47                        $font_file=$fonts[mt_rand(0,count($fonts)-1)];
48                        $font=imagecreatefrompng($font_file);
49                        $black=imagecolorallocate($font,0,0,0);
50                        $fontfile_width=imagesx($font);
51                        $fontfile_height=imagesy($font)-1;
52                        $font_metrics=array();
53                        $symbol=0;
54                        $reading_symbol=false;
55
56                        // loading font
57                        for($i=0;$i<$fontfile_width && $symbol<$alphabet_length;$i++){
58                                $transparent = (imagecolorat($font, $i, 0) >> 24) == 127;
59
60                                if(!$reading_symbol && !$transparent){
61                                        $font_metrics[$alphabet{$symbol}]=array('start'=>$i);
62                                        $reading_symbol=true;
63                                        continue;
64                                }
65
66                                if($reading_symbol && $transparent){
67                                        $font_metrics[$alphabet{$symbol}]['end']=$i;
68                                        $reading_symbol=false;
69                                        $symbol++;
70                                        continue;
71                                }
72                        }
73
74                        $img=imagecreatetruecolor($width,$height);
75                        $white=imagecolorallocate($img,255,255,255);
76                        $black=imagecolorallocate($img,0,0,0);
77
78                        imagefilledrectangle ($img,0,0,$width-1,$height-1,$white);
79
80                        // draw text
81                        $x=1;
82                        for($i=0;$i<$length;$i++){
83                                $m=$font_metrics[$this->keystring{$i}];
84
85                                $y=mt_rand(-$fluctuation_amplitude, $fluctuation_amplitude)+($height-$fontfile_height)/2+2;
86
87                                if($no_spaces){
88                                        $shift=0;
89                                        if($i>0){
90                                                $shift=1000;
91                                                for($sy=1;$sy<$fontfile_height-15;$sy+=2){
92                                                        for($sx=$m['start']-1;$sx<$m['end'];$sx++){
93                                                        $rgb=imagecolorat($font, $sx, $sy);
94                                                        $opacity=$rgb>>24;
95                                                                if($opacity<127){
96                                                                        $left=$sx-$m['start']+$x;
97                                                                        $py=$sy+$y;
98                                                                        for($px=min($left,$width-1);$px>$left-15 && $px>=0;$px--){
99                                                                        $color=imagecolorat($img, $px, $py) & 0xff;
100                                                                                if($color+$opacity<190){
101                                                                                        if($shift>$left-$px){
102                                                                                                $shift=$left-$px;
103                                                                                        }
104                                                                                        break;
105                                                                                }
106                                                                        }
107                                                                        break;
108                                                                }
109                                                        }
110                                                }
111                                        }
112                                }else{
113                                        $shift=1;
114                                }
115                                imagecopy($img,$font,$x-$shift,$y,$m['start'],1,$m['end']-$m['start'],$fontfile_height);
116                                $x+=$m['end']-$m['start']-$shift;
117                        }
118                        if($x<$width-10) break; // fit in canvas
119                       
120                }
121                $center=$x/2;
122
123                // credits. To remove, see configuration file
124                $img2=imagecreatetruecolor($width, $height+($show_credits?'12':0));
125                $foreground=imagecolorallocate($img2, $foreground_color[0], $foreground_color[1], $foreground_color[2]);
126                $background=imagecolorallocate($img2, $background_color[0], $background_color[1], $background_color[2]);
127                imagefilledrectangle($img2, 0, $height, $width-1, $height+12, $foreground);
128                $credits=empty($credits)?$_SERVER['HTTP_HOST']:$credits;
129                imagestring($img2, 2, $width/2-ImageFontWidth(2)*strlen($credits)/2, $height-2, $credits, $background);
130
131                // periods
132                $rand1=mt_rand(750000,1200000)/10000000;
133                $rand2=mt_rand(750000,1200000)/10000000;
134                $rand3=mt_rand(750000,1200000)/10000000;
135                $rand4=mt_rand(750000,1200000)/10000000;
136                // phases
137                $rand5=mt_rand(0,3141592)/500000;
138                $rand6=mt_rand(0,3141592)/500000;
139                $rand7=mt_rand(0,3141592)/500000;
140                $rand8=mt_rand(0,3141592)/500000;
141                // amplitudes
142                $rand9=mt_rand(330,420)/110;
143                $rand10=mt_rand(330,450)/110;
144
145                //wave distortion
146                for($x=0;$x<$width;$x++){
147                        for($y=0;$y<$height;$y++){
148                                $sx=$x+(sin($x*$rand1+$rand5)+sin($y*$rand3+$rand6))*$rand9-$width/2+$center+1;
149                                $sy=$y+(sin($x*$rand2+$rand7)+sin($y*$rand4+$rand8))*$rand10;
150               
151                                if($sx<0 || $sy<0 || $sx>=$width-1 || $sy>=$height-1){
152                                        $color=255;
153                                        $color_x=255;
154                                        $color_y=255;
155                                        $color_xy=255;
156                                }else{
157                                        $color=imagecolorat($img, $sx, $sy) & 0xFF;
158                                        $color_x=imagecolorat($img, $sx+1, $sy) & 0xFF;
159                                        $color_y=imagecolorat($img, $sx, $sy+1) & 0xFF;
160                                        $color_xy=imagecolorat($img, $sx+1, $sy+1) & 0xFF;
161                                }
162
163                                if($color==0 && $color_x==0 && $color_y==0 && $color_xy==0){
164                                        $newred=$foreground_color[0];
165                                        $newgreen=$foreground_color[1];
166                                        $newblue=$foreground_color[2];
167                                }else if($color==255 && $color_x==255 && $color_y==255 && $color_xy==255){
168                                        $newred=$background_color[0];
169                                        $newgreen=$background_color[1];
170                                        $newblue=$background_color[2]; 
171                                }else{
172                                        $frsx=$sx-floor($sx);
173                                        $frsy=$sy-floor($sy);
174                                        $frsx1=1-$frsx;
175                                        $frsy1=1-$frsy;
176                                        $newcolor=(
177                                                $color*$frsx1*$frsy1+
178                                                $color_x*$frsx*$frsy1+
179                                                $color_y*$frsx1*$frsy+
180                                                $color_xy*$frsx*$frsy);
181
182                                        if($newcolor>255) $newcolor=255;
183                                        $newcolor=$newcolor/255;
184                                        $newcolor0=1-$newcolor;
185
186                                        $newred=$newcolor0*$foreground_color[0]+$newcolor*$background_color[0];
187                                        $newgreen=$newcolor0*$foreground_color[1]+$newcolor*$background_color[1];
188                                        $newblue=$newcolor0*$foreground_color[2]+$newcolor*$background_color[2];
189                                }
190
191                                imagesetpixel($img2, $x, $y, imagecolorallocate($img2,$newred,$newgreen,$newblue));
192                        }
193                }
194
195                if(function_exists("imagejpeg")){
196                        header("Content-Type: image/jpeg");
197                        imagejpeg($img2, null, $jpeg_quality);
198                }else if(function_exists("imagegif")){
199                        header("Content-Type: image/gif");
200                        imagegif($img2);
201                }else if(function_exists("imagepng")){
202                        header("Content-Type: image/x-png");
203                        imagepng($img2);
204                }
205        }
206
207        // returns keystring
208        function getKeyString(){
209                return $this->keystring;
210        }
211}
212
213
214?>
Note: See TracBrowser for help on using the repository browser.