Как нарисовать точку в PHP GD

1

imagesetpixel($im, $x, $y, $color) рисует пиксел в заданных координатах $x, $y, цвет задаётся функцией imagecolorallocate($im, $r, $g, $b).

Вывод трёх точек разного цвета:

$im = imagecreatetruecolor(600, 250);
imagefill($im, 0, 0, 0x000000);

// Красная точка
$color = imagecolorallocate($im, 255, 0, 0);
imagesetpixel($im, 200, 125, $color);

// Зелёная точка
$color = imagecolorallocate($im, 0, 255, 0);
imagesetpixel($im, 300, 125, $color);

// Белая точка
$color = imagecolorallocate($im, 255, 255, 255);
imagesetpixel($im, 400, 125, $color);

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

Результат:

2

Полупрозрачность точки можно задать с помощью функции imagecolorallocatealpha($image, $r, $g, $b, $alpha), где $alpha значение от 0 до 127 (127 полностью прозрачный).

Вывод трёх точек c прозрачностью:

$im = imagecreatetruecolor(600, 250);
imagefill($im, 0, 0, 0x000000);

// Красная точка
$color = imagecolorallocatealpha($im, 255, 0, 0, 70);
imagesetpixel($im, 200, 125, $color);

// Зелёная точка
$color = imagecolorallocatealpha($im, 0, 255, 0, 70);
imagesetpixel($im, 300, 125, $color);

// Белая точка
$color = imagecolorallocatealpha($im, 255, 255, 255, 70);
imagesetpixel($im, 400, 125, $color);

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

Результат:

3

Функция imagesetthickness($im, 5) не влияет на толщину точки. Поэтому стоит применять другие функции, например функцию вывода эллипса:

$im = imagecreatetruecolor(600, 250);
imagefill($im, 0, 0, 0xffffff);

$color = imagecolorallocate($im, 255, 0, 0);

// Красная точка диаметром 4px
imagefilledellipse($im, 150, 125, 2, 2, $color);

// Красная точка диаметром 10px
imagefilledellipse($im, 300, 125, 5, 5, $color);

// Красная точка диаметром 20px
imagefilledellipse($im, 450, 125, 10, 10, $color);

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

Результат:

По документации более плавные линии можно сделать вызвав функцию imageantialias($im, true), но она обычно не работает вызывая ошибку:

Fatal error: Uncaught Error: Call to undefined function imageantialias() in ...

Другой вариант – нарисовать закрашенный круг большего размера и сжать его с помощью функции imagecopyresampled().

function imagefilledellipse_smooth(&$im, $cx, $cy, $w, $h, $color)
{
	$w2  = ($w * 2) + 1;
	$h2 = ($h * 2) + 1;
	
	$tmp = imagecreatetruecolor($w2, $h2);
	$bg = imagecolorallocatealpha($tmp, 255, 255, 255, 127); 
	imagefill($tmp, 0, 0, $bg); 
	imagealphablending($tmp, false);
	imagesavealpha($tmp, true);

	imagefilledellipse($tmp, $w2 / 2, $h2 / 2, $w2, $h2, $color);
	imagecopyresampled($im, $tmp, $cx - ($w / 2), $cy - ($h / 2), 0, 0, $w, $h, $w2, $h2);
}

$im = imagecreatetruecolor(600, 250);
imagefill($im, 0, 0, 0xffffff);

$color = imagecolorallocate($im, 255, 0, 0);

// Красная точка диаметром 4px
imagefilledellipse_smooth($im, 150, 125, 2, 2, $color);

// Красная точка диаметром 10px
imagefilledellipse_smooth($im, 300, 125, 5, 5, $color);

// Красная точка диаметром 20px
imagefilledellipse_smooth($im, 450, 125, 10, 10, $color);

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

Результат:

4
$w = 600;
$h = 300;

$im = imagecreatetruecolor($w, $h);
imagefill($im, 0, 0, 0xFFFFFF);

$black = imagecolorallocate($im, 0,0,0);
$red   = imagecolorallocate($im, 255, 0, 0);

imageline($im, 10, $h / 2, $w - 10, $h / 2, $black);
imageline($im, $w / 2, 10, $w / 2, $h - 10, $black);

$x = 0;
while ($x <= $w - 10){
	$xr = $x - $w / 2;
	$y = 70 * sin($xr / 20);
	imagesetpixel($im, $x, -$y + $h / 2, $red); 
	$x++;
}

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

Результат:

function set_rgb_noise($im, $w, $h, $num)
{
	for ($i = 0; $i < $num; $i++) {
		$color = imageColorAllocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
		imageSetPixel($im, mt_rand(0, $w), mt_rand(0, $h), $color);
	}
}

$im = imagecreatetruecolor(400, 250);
set_rgb_noise($im, 400, 250, 400 * 250);

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

Результат:

Результат:

function set_white_noise($im, $w, $h, $num)
{
	for ($i = 0; $i < $num; $i++) {
		$color = imageColorAllocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
		imageSetPixel($im, mt_rand(0, $w), mt_rand(0, $h), $color);
	}
	imagefilter($im, IMG_FILTER_GRAYSCALE);
}

$im = imagecreatetruecolor(400, 250);
set_white_noise($im, 400, 250, 400 * 250);

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

Результат:

$w = 400;
$h = 250;

$im = imagecreatetruecolor($w, $h);

for ($i = 0; $i <= $w; ++$i) {
	for ($j = 0; $j <= $h; ++$j) {
		$col = imagecolorallocate($im, 255, (255 / $w) * $i,  (255 / $h) * $j);
		imagesetpixel($im, $i, $j, $col);
	}
}

header('Content-Type: image/png');
imagepng($im);
exit;
PHP
14.04.2022, обновлено 18.11.2022
2071

Комментарии

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

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

Изображения WebP в GD PHP
WebP – формат сжатия изображений, разработанный Google. Имеет более меньший размер файла по сравнению с JPG, но не поддерживается продуктами Apple.
19213
+6
PHP-класс для создания миниатюр изображений
PHP Thumb – это библиотека, основанная на PHP GD и предназначена для создания превью изображений для каталогов, товаров...
49456
+13
Поворот изображения по двум точкам на PHP GD + jQuery UI Droppable
​Задача - необходимо повернуть изображение на угол, найденный путем выставления двух точек на линию горизонта...
2042
0
Генерация QR-кода в PHP
Вопрос генерации QR-кодов в PHP достаточно освещён, есть много библиотек, одной из них является «PHP QR Code» – быстрый и легкий класс, рассмотрим его применение совместно с графической библиотекой...
66808
+18
Примеры использования cURL в PHP
cURL PHP – это библиотека предназначенная для получения и передачи данных через такие протоколы, как HTTP, FTP, HTTPS....
220189
+21
Мануал по созданию и форматированию excel файлов в PHPExcel
К сожалению разработчики прекратили поддержку и разработку проекта, но PHPExcel все равно остается популярной...
129436
+37