Доступ к архиву

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Генерация изображений в php

Статус
В этой теме нельзя размещать новые ответы.

Kirill_Polyakov

Ученик
Надеюсь, вы прекрасно осознаете, что нельзя вот так вот просто взять и вывести картинку посреди HTML-кода в том же самом скрипте (если не осознаете, прочтите внимательно эту статью): в HTML-документе мы разместим, как и обычно, тэг <img>, а в его атрибуте src укажем не картинку, как обычно, а PHP-скрипт:

PHP:
<img src="/i/articles/image/image.php">
Теперь приступим к написанию этого самого image.php.

Заголовок. Он же header.

Прежде всего, как браузер узнает, что image.php - это не HTML-документ и не что-то еще, а картинка?

Тип документа броузер определяет по заголовку Content-type. На самом деле, этот заголовок - обязательный и всегда присуствует; по умолчанию, PHP услужливо "отдает" заголовок Content-type: text/html. Обычно это поведение PHP нам прекрасно подходит - но не в данном случае. Придется нам вывести нужный заголовок самим:

PHP:
<?php

  header('Content-type: image/png'); // устанавливаем тип документа - "изображение в формате PNG".

?>
Создание изображения

Для создания изображения, в нашем распоряжении две функции:

1. imagecreate(). С помощью этой функции можно создать изображение на основе палитры, содержащей фиксированный набор цветов. Каждый цвет палитры необходимо описать с помощью функции imagecolorallocate(). Этот способ создания изображения был единственным при работе с первой версией GD, и необходим при работе с ориентированными на палитру форматами, такими как GIF. Однако введенный во второй версии (и отныне рекомендуемый разработчиками) способ, на мой взгляд, гораздо более удобен.

2. imagecreatetruecolor(). Эта функция создает TrueColor-изображение, то есть цвет каждой точки определяется произвольным цветом, задаваемым в координатах RGB. Помимо того, что это удобнее, чем работа с палитрой, такой подход позволяет производить масштабирование изображения с гораздо меньшими потерями качества. Но об этом позже. Сейчас просто создадим изображение:

PHP:
<?php

    $image = imagecreatetruecolor(80,60) // создаем изображение...
    or die('Cannot create image');     // ...или прерываем работу скрипта в случае ошибки
    imagedestroy($image);                // освобождаем память, выделенную для изображения

?>
Функция imagecreatetruecolor (как, кстати, и функция imagecreate), принимает два обязательных целочисленных параметра - ширину (в нашем примере - 80 пикселей) и высоту (60 пикселей) картинки, и возвращает идентификатор ресурса (в данном случае - изображения), который мы присваиваем переменной $image, которой в дальнейшем будем постоянно пользоваться.

Если по какой-либо страшной причине (недостатке памяти, например) создать изображение не получается, функция возвращает false - в этом случае мы прерываем работу скрипта.

Хотя мы с этим изображением, пока что, ничего не делаем, мы обязаны освободить выделенную для него память с помощью функции imagedestroy(): к сожалению, автоматическое освобождение памяти происходит не всегда, и игнорирование рекомендации всегда использовать imagedestroy может привести к весьма серьезным утечкам памяти.

Немножко порисуем

Итак, с помощью функции imagecreatetruecolor() мы создали "труколорное" и, если верить документации, черное изображение размером 80x60. Так что, те, в чьи планы входит создание Web-галереи репродукций "квадрата Малевича", могут смело переходить к следующей главе. Для остальных, продолжим. Нарисуем на картинке что-нибудь содержательное.

PHP:
<?php

  $image = imagecreatetruecolor(80,60) // создаем изображение... 
    or die('Cannot create image');     // ...или прерываем работу скрипта в случае ошибки 

  // "Зальем" фон картинки синим цветом...
  imagefill($image, 0, 0, 0x000080);
  // Нарисуем желтый контурный эллипс...
  imageellipse($image, 40, 30, 50, 50, 0xFFFF00);
  // ...и еще пару, но сплошных...
  imagefilledellipse($image, 30, 20, 10, 10, 0xFFFF00);
  imagefilledellipse($image, 50, 20, 10, 10, 0xFFFF00);
  // ...вертикальную линию...
  imageline($image, 40, 28, 40, 38, 0xFFFF00);
  // ...и дугу.
  imagearc($image, 40, 30, 40, 40, 45, 135, 0xFFFF00);

  // Устанавливаем тип документа - "изображение в формате PNG"...
  header('Content-type: image/png'); 
  // ...И, наконец, выведем сгенерированную картинку в формате PNG:
  imagepng($image);

  imagedestroy($image);                // освобождаем память, выделенную для изображения

?>
Автор: Не я
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу