. /** * Generate random grades and feedback to initialize development environment * @package local_treestudyplan * @copyright 2023 P.M. Kuipers - Chris Zuber * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ namespace local_treestudyplan\local; use Exception; /** * Generate random grades and feedback to initialize development environment */ class randomimage { /** * Image width * @var int */ private $width; /** * Image height * @var int */ private $height; /** * Number of shapes to draw * @var int */ private $shapes; /** * Image name * @var string */ public $name; /** * Image temporary file * @var string */ public $tempfile; /** * Various available styles for arcs * @var array */ const ARC_STYLES = [ IMG_ARC_PIE, IMG_ARC_CHORD, IMG_ARC_EDGED, IMG_ARC_NOFILL, ]; /** * Create a random polygon with number of points between 0 & $maxpts * @param \GdImage $im The image reource * @param int $maxpts Max number of point to use * @return void */ private function random_polygon($im, int $maxpts = 20) { $color = imagecolorallocatealpha($im, ...$this->random_color_alpha()); $numpoints = \random_int(3, $maxpts); $pts = $this->random_pts($numpoints); imagefilledpolygon($im, $pts, $numpoints, $color); } /** * Creates a random arc of a random color * @param \GdImage $im The image resource * @return void */ private function random_arc($im) { $cx = \random_int(0, $this->width); $cy = \random_int(0, $this->height); $w = \random_int(0, $this->width); $h = \random_int(0, $this->height); $s = \random_int(0, 360); $e = \random_int(0, 360); $col = imagecolorallocatealpha($im, ...$this->random_color_alpha()); $style = self::ARC_STYLES[\random_int(0, 3)]; imagefilledarc($im, $cx, $cy, $w, $h, $s, $e, $col, $style); } /** * Generates an array of random alpha color values. * @return Array [r, g, b, a] */ private function random_color_alpha(): Array { return [ \random_int(0, 255), \random_int(0, 255), \random_int(0, 255), \random_int(0, 127), ]; } /** * Generates a set of random points for a polygon [x1, y1, x2, y2, ...] * @param integer $length Number of sets of points to generate * @return Array The resulting array of points */ private function random_pts($length): Array { $pts = []; for ($n = 0; $n < $length; $n++) { $pts[] = \random_int(0, $this->width); $pts[] = \random_int(0, $this->height); } return $pts; } /** * Create new random image * @param int $shapes Number of shapes * @param int $width Width of the images generated * @param int $height Height of the images generated */ public function __construct($shapes=3, $width=256, $height=256) { $this->shapes = $shapes; $this->width = $width; $this->height = $height; $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $string = ''; for ($i = 0; $i < 20; $i++) { $string .= $characters[\mt_rand(0, strlen($characters) - 1)]; } $this->name = $string.".png"; $im = imagecreatetruecolor($this->width, $this->height); for ($i = 0; $i < $this->shapes; $i++) { switch(\random_int(1, 2)) { case 1: $this->random_arc($im); break; case 2: $this->random_polygon($im); break; } } $this->tempfile = \tempnam("/tmp", "tsp"); imagepng($im, $this->tempfile); imagedestroy($im); } /** * Get image content as string * @return string */ public function content() { return $this->content = \file_get_contents($this->tempfile); } /** * Destructor for random image object */ public function __destruct() { if (isset($this->tempfile) && file_exists($this->tempfile)) { unlink($this->tempfile); } } }