БлогNot. PHP: генерируем картинку с шахматной доской

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 [4039 просмотров]


теги: учебное шахматы графика php

К этой статье пока нет комментариев, Ваш будет первым