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();
Результат:
Полупрозрачность точки можно задать с помощью функции 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();
Результат:
Функция 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();
Результат:
По документации более плавные линии можно сделать вызвав функцию 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();
Результат:
Построение графика синусоиды
$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;
Результат:
Цветной шум
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;
Результат:
Белый шум
Результат:
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;
Заливка холста градиентом
Результат:
$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;