"#ebdbb2", "fg" => "#1d2021" ]; }else{ $theme = [ "bg" => "#1d2021", "fg" => "#ebdbb2" ]; } $im = new Imagick(); $im->newImage(400, 427, $theme["bg"]); $im->setImageBackgroundColor($theme["bg"]); $im->setImageFormat("jpg"); $noise = [ imagick::NOISE_GAUSSIAN, imagick::NOISE_LAPLACIAN ]; $distort = [ imagick::DISTORTION_AFFINE, imagick::DISTORTION_SHEPARDS ]; $i = 0; for($y=0; $y<4; $y++){ for($x=0; $x<4; $x++){ $tmp = new Imagick("./data/captcha/" . $grid[$i][0] . "/" . random_int(1, $grid[$i][1]) . ".png"); // convert transparency correctly $tmp->setImageBackgroundColor("black"); $tmp->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE); // randomly mirror if(random_int(0,1) === 1){ $tmp->flopImage(); } // distort $tmp $tmp->distortImage( $distort[random_int(0,1)], [ 0, 0, random_int(-15, 15), random_int(-15, 15), 100, 0, random_int(80, 120), random_int(-15, 15), 100, 100, random_int(80, 120), random_int(80, 120), 0, 100, random_int(-15, 15), random_int(80, 120) ], false ); $tmp->addNoiseImage($noise[random_int(0, 1)]); // append image $im->compositeImage($tmp->getImage(), Imagick::COMPOSITE_DEFAULT, $x * 100, ($y * 100) + 27); $i++; } } // add text $draw = new ImagickDraw(); $draw->setFontSize(20); $draw->setFillColor($theme["fg"]); //$draw->setTextAntialias(false); $draw->setFont("./data/fonts/captcha.ttf"); $text = "Pick " . $picks . " images of " . str_replace("_", " ", $choosen[0]); $pos = 200 - ($im->queryFontMetrics($draw, $text)["textWidth"] / 2); for($i=0; $iannotateImage( $draw, $pos, 20, random_int(-15, 15), $text[$i] ); $pos += $im->queryFontMetrics($draw, $text[$i])["textWidth"]; } $im->setFormat("jpeg"); $im->setImageCompressionQuality(90); echo $im->getImageBlob();