БлогNot. PHP: как вернуть динамически сгенерированную картинку и вставить её на страницу

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.'"/>';
?>
результат работы примера (фрагмент экрана)
результат работы примера (фрагмент экрана)

теги: графика программирование php картинка

16.07.2020, 00:41; рейтинг: 63