Captchaを自作してみた


そういえばあれはどうやって作るんだろうっておもって
作ってみました。

意外と簡単だった。

こんなかんじ。

日本語を出すにはフォントいれとかないとだめだというのに
ちょっとはまったくらいかな。
PHPで画像いじるの意外と面白いかもw

一応ソースはこんなかんじ。

header("Content-type: image/png");

//設定
$string = 'きゃぷちゃテストね';
$width = 250;
$height = 100;
$fontSize = 20;
$distortion = true;

//フォントのパス設定
putenv('GDFONTPATH='.realpath('.'));
$font = 'fontname';

//元画像を使わないから1から作成
$img = imagecreatetruecolor($width,$height);

//captchaで使う色を設定
$black = imagecolorallocate($img,22,22,22);
$darkGray = imagecolorallocate($img,55,55,55);
$gray = imagecolorallocate($img,200,200,200);
$white = imagecolorallocate($img,255,255,255);

//画像を背景色でfill
imagefill($img,0,0,$white);

//センタリング処理用
$wd = (imagesx($img) - $fontSize * 0.35 * strlen($string)) / 2;
$ht = $height / 2 + $fontSize * 0.35;


//各文字を表示
for ($i=0;$i < mb_strlen($string);$i++) {
    $putString = mb_substr($string,$i,1,'UTF-8');
    imagettftext($img,$fontSize + rand(-5,5),rand(-5,5),$wd + $fontSize * $i,$ht + rand(-10,10),$darkGray,$font,$putString);
}

//ディストーション処理
if ($distortion) {
    imagesetthickness($img,1);

    //ラインディストーション
    $i = 0;
    while ($i<25) {
        $randWidth1 = rand(0,$width);
        $randHeight1 = rand(0,$height);
        $randWidth2 = rand(0,$width);
        $randHeight2 = rand(0,$height);
        imageline($img,$randWidth1,$randHeight1,$randWidth2,$randHeight2,$gray);
        $i++;
    }

    //ドットディストーション
    $i = 0;
    while ($i<200) {
        $randWidth = rand(0,$width);
        $randHeight = rand(0,$height);
        imagesetpixel($img,$randWidth,$randHeight,$black);
        $i++;
    }
    //ガウス処理
    $gaus = array(array(1.0, 2.0, 1.0), array(2.0, 4.0, 2.0), array(1.0, 2.0, 1.0));
    imageconvolution($img,$gaus,16,0);
}

//枠ぶち描画
imagesetthickness($img,5);
$rectangle = array(0,0,0,$height,$width,$height,$width,0);
imagepolygon($img,$rectangle,4,$black);
imagesetthickness($img,1);
$rectangle = array(0,0,0,$height,$width,$height,$width,0);
imagepolygon($img,$rectangle,4,$white);

//最終画像出力
imagepng($img);
imagedestroy($img)

Leave a Reply