PHP: генерируем картинку с шахматной доской
С утра пришла в голову мысль, что легко моделировать только строгий порядок или наоборот полный хаос (хаос моделируется заметно хуже), жаль только, в жизни не бывает ни того, ни другого :)
Ну а скриптик просто учебный, он показывает, как сделать кодом PHP картинку с шахматной доской произвольного размера и подписать горизонтали с вертикалями, применяя выравнивание текста на рисунке.
Чем-то похожий "интерпретатор" с целым входным языком был вот здесь.
Для стандартной функции imagettftext параметры $x
, $y
задают нижний левый край выводимой строки, поэтому
в коде понадобилось "искусственное" выравнивание символов с помощью расчётов над переменными $x
, $y
.
Файл шрифта verdana.ttf
поместили в папку скрипта из исходной скрытой папки C:\Windows\Fonts\
Проверка доступности библиотеки GD - самая простая, доступна ли функция imagecreate
.
Некоторые пропорции рассчитаны в "золотом сечении" просто так :)
<?php function chessboard ($n=8) { //$n - размер доски в клетках $size = 60; //размер одной клетки доски в пикселах $GOLD = (sqrt(5)-1)/2; //"золотое сечение" :) $bordersize = round($size*$GOLD); //размер краёв вокруг доски $width = $size; $height = $size; //ширина и высота клетки равны $color = ''; //цвет "белый"-"чёрный" $size_x = 2*$bordersize+$width*$n; //общие размеры $size_y = 2*$bordersize+$height*$n; //рисунка $img=imagecreate($size_x,$size_y); //создать рисунок $bordercolor = imagecolorallocate($img,204,204,204); //создать фоновый цвет imagefilledrectangle($img,0,0,$size_x-1,$size_y-1,$bordercolor); //залить им for ($i=0; $i<$n; $i++) //отрисовать квадратики for ($j=0; $j<$n; $j++) { if (($i+$j)%2==1 and $n%2==0 or ($i+$j)%2==0 and $n%2==1) $color = imagecolorallocate($img,0,0,0); else $color = imagecolorallocate($img,255,255,255); $x = $bordersize + $i*$width; $y = $bordersize + $j*$height; imagefilledrectangle($img,$x,$y,$x+$width-1,$y+$height-1,$color); } $letter='a'; //подписи вертикалей доски a,b,c... $lettercolor = imagecolorallocate($img,0,0,128); $lettersize = round($bordersize*(1-$GOLD)); for ($i=0; $i<$n; $i++) { $box = imagettfbbox($lettersize,0,'./verdana.ttf',$letter); $x = $bordersize + $i*$width + round($width/2) - round(($box[2]-$box[0])/2); $y = $size_y - round($bordersize*(1-$GOLD)); imagettftext($img,$lettersize,0,$x,$y,$lettercolor,'./verdana.ttf',$letter); $letter++; } $number=''.$n; //подписи горизонталей 1,2,3,... for ($i=0; $i<$n; $i++) { $box = imagettfbbox($lettersize,0,'./verdana.ttf',$number); $x = round($bordersize/2)-round(($box[2]-$box[0])/2); $y = $bordersize + $i*$height+round($height/2)+round(($box[1]-$box[7])/2); imagettftext($img,$lettersize,0,$x,$y,$lettercolor,'./verdana.ttf',$number); $number--; } return $img; } //пример вызова функции if (!function_exists('imagecreate')) die ('No GD support!'); $img = chessboard(); //отдаём контент для браузера header('Content-Disposition: inline; filename=board.jpg'); header('Content-Type: image/jpeg'); imagejpeg($img); imagedestroy($img); ?>
Скрипт проверен на локалхосте в "Денвере", вот такая вышла картинка при параметрах функции по умолчанию.
вывод скрипта при параметрах по умолчанию
P.S. В PHP 7-8 работает, например, так (предполагая, что шрифт arial.ttf находится в папке скрипта):
<?php function chessboard ($n=8) { //$n - размер доски в клетках $size = 60; //размер одной клетки доски в пикселах $GOLD = (sqrt(5)-1)/2; //"золотое сечение" :) $bordersize = round($size*$GOLD); //размер краёв вокруг доски $width = $size; $height = $size; //ширина и высота клетки равны $color = ''; //цвет "белый"-"чёрный" $size_x = 2*$bordersize+$width*$n; //общие размеры $size_y = 2*$bordersize+$height*$n; //рисунка $img=imagecreate($size_x,$size_y); //создать рисунок $bordercolor = imagecolorallocate($img,204,204,204); //создать фоновый цвет imagefilledrectangle($img,0,0,$size_x-1,$size_y-1,$bordercolor); //залить им for ($i=0; $i<$n; $i++) //отрисовать квадратики for ($j=0; $j<$n; $j++) { if (($i+$j)%2==1 and $n%2==0 or ($i+$j)%2==0 and $n%2==1) $color = imagecolorallocate($img,0,0,0); else $color = imagecolorallocate($img,255,255,255); $x = $bordersize + $i*$width; $y = $bordersize + $j*$height; imagefilledrectangle($img,$x,$y,$x+$width-1,$y+$height-1,$color); } $letter='a'; //подписи вертикалей доски a,b,c... $lettercolor = imagecolorallocate($img,0,0,128); $lettersize = round($bordersize*(1-$GOLD)); for ($i=0; $i<$n; $i++) { $font = dirname(__FILE__) . '/arial.ttf'; $box = imagettfbbox($lettersize,0,$font,$letter); $x = $bordersize + $i*$width + round($width/2) - round(($box[2]-$box[0])/2); $y = $size_y - round($bordersize*(1-$GOLD)); imagettftext($img,$lettersize,0,$x,$y,$lettercolor,$font,$letter); $letter++; } $number=''.$n; //подписи горизонталей 1,2,3,... for ($i=0; $i<$n; $i++) { $box = imagettfbbox($lettersize,0,$font,$number); $x = round($bordersize/2)-round(($box[2]-$box[0])/2); $y = $bordersize + $i*$height+round($height/2)+round(($box[1]-$box[7])/2); imagettftext($img,$lettersize,0,$x,$y,$lettercolor,$font,$number); $number--; } return $img; } //пример вызова функции if (!function_exists('imagecreate')) die ('No GD support!'); $img = chessboard(); //отдаём контент для браузера header('Content-Disposition: inline; filename=board.jpg'); header('Content-Type: image/jpeg'); imagejpeg($img); imagedestroy($img); ?>
18.01.2017, 13:27 [4129 просмотров]