PHP: как вернуть динамически сгенерированную картинку и вставить её на страницу
Представьте, что нам нужно не просто настроить некие входные параметры и сгенерировать по ним картинку как вот здесь, и не подставить в документ динамически создаваемое из готовых фрагментов изображение, как в этой капче (хотя там уже есть ответ на вопрос статьи), но мы хотим программно создать некий графический объект (в примере я ограничусь картинкой PNG) и вывести его непосредственно в контент страницы, в идеале, в виде
require_once('imageClass.php'); //подключаем класс работы с изображениями $b = new imageClass (16, 16); //создаём маленькую картинку $b //что-то рисуем в $b echo '<img src="'.$b.'"/>'; //выводим $b
При этом, конечно, контент не должен быть единственным на странице, так что директивой типа
header("Content-type:image/png")
, которую нужно отправлять до любого другого контента, мы пользоваться не должны.
В инете много странных советов, а на самом деле тогда остаётся только старое доброе кодирование base64 (см. метод __toString
класса imageClass
).
Чтобы что-то ещё уметь, класс может конструктором создать изображение с нужным размером в пикселах, удалить его деструктором, залить прямоугольник заданного размера цветом RGB, получить и установить цвет пикселя. Функциональность нетрудно расширить, так как она использует только стандартные средства библиотеки GD.
Благодаря ей же, нам не придётся детально описывать "физический" формат изображения, как на C++. Ниже приводится исходник и скриншот результата работы теста, полученного на локальном хосте XAMPP с PHP версии 7.4, кодировка скрипта - UTF-8.
Файл imageClass.php
<?php class imageClass { private $image, $w, $h; public function __construct($w = 16, $h = 16) { $this->image = imagecreatetruecolor ($w, $h); $this->w = $w; $this->h = $h; } public function __destruct() { imagedestroy ($this->image); } public function __toString() { ob_start(); imagepng ($this->image); $outputBuffer = ob_get_clean(); $base64 = 'data:image/png;base64,'.base64_encode($outputBuffer); ob_end_flush(); return $base64; } public function fill ($x = 0, $y = 0, $w = null, $h = null, $color = [0,0,0]){ if (is_null($w)) $w = $this->w - 1; if (is_null($h)) $h = $this->h - 1; $w += ($x-1); $h += ($y-1); $mycolor = imagecolorallocate ($this->image, $color[0], $color[1], $color[2]); imagefilledrectangle ($this->image, $x, $y, $w, $h, $mycolor); } public function setPixel($x, $y, $color = [0,0,0]){ if ($x >= $this->w) $x = $this->w - 1; if ($x < 0) $x = 0; if ($y >= $this->h) $y = $this->h - 1; if ($y < 0) $y = 0; $mycolor = imagecolorallocate ($this->image, $color[0], $color[1], $color[2]); imagesetpixel ($this->image, $x, $y, $mycolor); } public function getPixel($x, $y){ if ($x >= $this->w) $x = $this->w - 1; if ($x < 0) $x = 0; if ($y >= $this->h) $y = $this->h - 1; if ($y < 0) $y = 0; $mycolor = imagecolorat ($this->image, $x, $y); if ($mycolor === false) return false; $r = ($mycolor >> 16) & 0xFF; $g = ($mycolor >> 8) & 0xFF; $b = $mycolor & 0xFF; return [$r,$g,$b]; } } ?>
Файл .php с тестом для imageClass
<?php require_once('imageClass.php'); $b = new imageClass (16, 16); $b->fill(); //чёрная заливка $b->fill(2, 2, 12, 12, [99,99,99]); //серая заливка внутри $b->setPixel (0, 15, [255,0,0]); //красный пиксел слева внизу $pixel = $b->getPixel(3,3); //серый if ($pixel) echo '<p>Цвет пиксела='.$pixel[0].','.$pixel[1].','.$pixel[2].'</p>'; else echo 'Error!'; echo '<img src="'.$b.'"/>'; ?>
результат работы примера (фрагмент экрана)
16.07.2020, 00:41 [1558 просмотров]