Рисование линий в PHP GD

Примеры использования функций библиотеки GD для рисования линий.

За отрисовку линии отвечает функция imageline($image, $x1, $y1, $x2, $y2, $color) соединяя две точки.

// Создаем изображение с белым фоном
$im = imagecreatetruecolor(600, 250);
imagefill($im, 0, 0, 0xFFFFFF);

// Красная линия
$color = imagecolorallocate($im, 255, 0, 0);
imageline($im, 100, 50, 100, 200, $color);

// Зелёная линия
$color = imagecolorallocate($im, 0, 255, 0);
imageline($im, 200, 200, 350, 200, $color);

// Синяя линия
$color = imagecolorallocate($im, 0, 0, 255);
imageline($im, 400, 50, 550, 200, $color);

header('Content-Type: image/png');
imagepng($im);
exit();
PHP

Результат:

PHP GD линии
1

Что бы сделать линию полупрозрачной, нужно задать цвет с помощью функции imagecolorallocatealpha($image, $red, $green, $blue, $alpha), где $alpha значение от 0 до 127 (127 полностью прозрачный).

// Создаем изображение с белым фоном
$im = imagecreatetruecolor(600, 250);
imagefill($im, 0, 0, 0xFFFFFF);

// Красная линия
$color = imagecolorallocatealpha($im, 255, 0, 0, 65);
imageline($im, 100, 50, 100, 200, $color);

// Зелёная линия
$color = imagecolorallocatealpha($im, 0, 255, 0, 65);
imageline($im, 200, 200, 350, 200, $color);

// Синяя линия
$color = imagecolorallocatealpha($im, 0, 0, 255, 65);
imageline($im, 400, 50, 550, 200, $color);


header('Content-Type: image/png');
imagepng($im);
exit();
PHP

Результат:

2

Толщину линий задает функция imagesetthickness($image, $thickness).

// Создаем изображение с белым фоном
$im = imagecreatetruecolor(600, 250);
imagefill($im, 0, 0, 0xFFFFFF);

// Красная линия 2px
imagesetthickness($im, 2);
$color = imagecolorallocate($im, 255, 0, 0);
imageline($im, 100, 50, 100, 200, $color);

// Зелёная линия 5px
imagesetthickness($im, 5);
$color = imagecolorallocate($im, 0, 255, 0);
imageline($im, 200, 200, 350, 200, $color);

// Синяя линия 6px
imagesetthickness($im, 6);
$color = imagecolorallocate($im, 0, 0, 255);
imageline($im, 400, 50, 550, 200, $color);

header('Content-Type: image/png');
imagepng($im);
exit();
PHP

Результат:

3

Функция imagedashedline($image, $x1, $y1, $x2, $y2, $color) рисует пунктирную линию, но эта функция устарела.

// Создаем изображение с белым фоном
$im = imagecreatetruecolor(600, 250);
imagefill($im, 0, 0, 0xFFFFFF);

// Красная пунктирная линия
$color = imagecolorallocate($im, 255, 0, 0);
imagedashedline($im, 100, 50, 100, 200, $color);

// Зелёная пунктирная линия
$color = imagecolorallocate($im, 0, 255, 0);
imagedashedline($im, 200, 200, 350, 200, $color);

// Синяя пунктирная линия
$color = imagecolorallocate($im, 0, 0, 255);
imagedashedline($im, 400, 50, 550, 200, $color);

header('Content-Type: image/png');
imagepng($im);
exit();
PHP

Результат:

Предлагается использовать функцию imageline() со стилем назначенным через imagesetstyle($image, $style), где $style массив, в котором попиксельно содержится паттерн цветов.

// Создаем изображение с белым фоном
$im = imagecreatetruecolor(600, 250);
imagefill($im, 0, 0, 0xFFFFFF);
 
// Красная пунктирная линия
$color_1 = imagecolorallocate($im, 255, 0, 0);
$color_2 = imagecolorallocatealpha($im, 0, 0, 0, 127);
imagesetstyle($im, array($color_1, $color_1, $color_1, $color_1, $color_2, $color_2));
imageline($im, 100, 50, 100, 200, IMG_COLOR_STYLED);
 
// Зелёная пунктирная линия
$color_1 = imagecolorallocate($im, 0, 255, 0);
$color_2 = imagecolorallocatealpha($im, 0, 0, 0, 127);
imagesetstyle($im, array($color_1, $color_1, $color_1, $color_1, $color_2, $color_2));
imageline($im, 200, 200, 350, 200, IMG_COLOR_STYLED);
 
// Синяя пунктирная линия
$color_1 = imagecolorallocate($im, 0, 0, 255);
$color_2 = imagecolorallocatealpha($im, 0, 0, 0, 127);
imagesetstyle($im, array($color_1, $color_1, $color_1, $color_1, $color_2, $color_2));
imageline($im, 400, 50, 550, 200, IMG_COLOR_STYLED);
 
header('Content-Type: image/png');
imagepng($im);
exit;
PHP

Результат:

Если использовать функцию imagesetthickness(), то она работает не совсем корректно, например:

// Создаем изображение с белым фоном
$im = imagecreatetruecolor(600, 250);
imagefill($im, 0, 0, 0xFFFFFF);
 
// Толщина линий
imagesetthickness($im, 5);
 
// Красная пунктирная линия
$color_1 = imagecolorallocate($im, 255, 0, 0);
$color_2 = imagecolorallocatealpha($im, 0, 0, 0, 127);
imagesetstyle($im, array($color_1, $color_1, $color_1, $color_1, $color_2, $color_2));
imageline($im, 100, 50, 100, 200, IMG_COLOR_STYLED);
 
// Зелёная пунктирная линия
$color_1 = imagecolorallocate($im, 0, 255, 0);
$color_2 = imagecolorallocatealpha($im, 0, 0, 0, 127);
imagesetstyle($im, array($color_1, $color_1, $color_1, $color_1, $color_2, $color_2));
imageline($im, 200, 200, 350, 200, IMG_COLOR_STYLED);
 
// Синяя пунктирная линия
$color_1 = imagecolorallocate($im, 0, 0, 255);
$color_2 = imagecolorallocatealpha($im, 0, 0, 0, 127);
imagesetstyle($im, array($color_1, $color_1, $color_1, $color_1, $color_2, $color_2));
imageline($im, 400, 50, 550, 200, IMG_COLOR_STYLED);
 
header('Content-Type: image/png');
imagepng($im);
exit;
PHP

Результат:

19.12.2022
2702

Комментарии

, чтобы добавить комментарий.

Другие публикации

PHP-класс для создания миниатюр изображений
PHP Thumb – это библиотека, основанная на PHP GD и предназначена для создания превью изображений для каталогов, товаров...
49459
+13
Как нарисовать точку в PHP GD
Примеры, как нарисовать точку в библиотеке PHP GD.
2072
+1
Поворот изображения по двум точкам на PHP GD + jQuery UI Droppable
​Задача - необходимо повернуть изображение на угол, найденный путем выставления двух точек на линию горизонта...
2042
0
Генерация QR-кода в PHP
Вопрос генерации QR-кодов в PHP достаточно освещён, есть много библиотек, одной из них является «PHP QR Code» – быстрый и легкий класс, рассмотрим его применение совместно с графической библиотекой...
66831
+18
Генерация счета на оплату PDF PHP
С помощью расширения dompdf можно легко сформировать PDF файл. По сути, dompdf - это конвертер HTML в PDF который...
66064
+33
Мануал по созданию и форматированию excel файлов в PHPExcel
К сожалению разработчики прекратили поддержку и разработку проекта, но PHPExcel все равно остается популярной...
129459
+37