Рисование точки и линии
Рисование точки
В этом уроке помимо стандартных способов рисования точек и линий рассматриваются более сложные - рисование сглаженной линии, рисование линий произвольной ширины. Кроме того, приведен пример частичного затемнения картинки для создании подписи.
Для рисования точки используется функцияimagesetpixel:
imagesetpixel() рисует на изображенииimageточку с координатамx,yи цветомcolor. Верхний левый угол имеет координаты 0,0.
Пример 7.Рисование точки
$img = imagecreatetruecolor(320, 240);
$ink = imagecolorallocate($img, 255, 255, 255);
imagesetpixel($img,160,120,$ink);
imagepng($img);
imagedestroy($img);
Результат работы этой программы выглядит следующим образом:

С помощью точки можно нарисовать что угодно. Для иллюстрации рассмотрим такую простую программу:
Пример 8.
$img = imagecreatetruecolor(320, 240);
for ($i=0;$i<320;$i++)
for ($j=0;$j<240;$j++) {
$ink = imagecolorallocate($img, $i*$j, $i*$j, $i*$j);
imagesetpixel($img,$i,$j,$ink);
}
imagepng($img);
imagedestroy($img);
Результат работы этой программы выглядит следующим образом:

Рисование линии
Для рисования линии используется функцияimageline:
[code=php
int imageline ( resource image, int x1, int y1, int x2, int y2, int color)
[/code]
imageline() рисует на изображенииimageотрезок, начинающийся в точке x1:y1, заканчивающийся в точке x2:y2 и имеющий цветcolor. Верхний левый угол имеет координаты 0:0.
Пример 9.Рисование линии
$img = imagecreatetruecolor(320, 240);
$ink = imagecolorallocate($img, 255, 255, 255);
imageline($img,0,0,320-1,240-1,$ink);
imagepng($img);
imagedestroy($img);
Результат работы этой программы выглядит следующим образом:

См. также:
- Вывод линии. алгоритм Брезенхема (PHP)
- @Вывод линий, алгоритм Брезенхема, алгоритм ЦДА (Pascal)
- @Вывод линии. алгоритм Брезенхема (Си)
Рисование линии произвольной ширины
Иногда появляется необходимость рисованиялинии произвольной толщины(пример будет рассмотрен в уроке 13). Функции рисования такой линии нет, но мы может сами написать ее:
Пример 10.Рисование линии произвольной толщины.
if ($thick == 1) {
return imageline($image, $x1, $y1, $x2, $y2, $color);
}
$t = $thick / 2 - 0.5;
if ($x1 == $x2 || $y1 == $y2) {
return imagefilledrectangle($image,
round(min($x1, $x2) - $t),
round(min($y1, $y2) - $t),
round(max($x1, $x2) + $t),
round(max($y1, $y2) + $t), $color);
}
$k = ($y2 - $y1) / ($x2 - $x1); //y = kx + q
$a = $t / sqrt(1 + pow($k, 2));
$points = array(
round($x1 - (1+$k)*$a), round($y1 + (1-$k)*$a),
round($x1 - (1-$k)*$a), round($y1 - (1+$k)*$a),
round($x2 + (1+$k)*$a), round($y2 - (1-$k)*$a),
round($x2 + (1-$k)*$a), round($y2 + (1+$k)*$a),
);
imagefilledpolygon($image, $points, 4, $color);
return imagepolygon($image, $points, 4, $color);
}
header ("Content-type: image/png");
$img = imagecreatetruecolor(320, 240);
$ink = imagecolorallocate($img, 255, 255, 255);
imagelinethick($img,10,10,320-11,240-11,$ink,2);
imagelinethick($img,10,240-10,320-11,240-(240-11),$ink,10);
imagepng($img);
imagedestroy($img);
Результат работы этой программы выглядит следующим образом:

Рисование сглаженной линии
Пример рисования сглаженной линиивы можете найти здесь. Результат работы этой программы выглядит следующим образом:

На картинке хорошо видно, что линии в верхней части более гладкие. Я не рекомендую злоупотреблять функциейimagesmoothlineэтого примера. Она работает слишком медленно. Дождитесь лучше урока 13.
Заключение
В заключении хотелось бы привести пример простой программы, позволяющей выводить подпись на затемненной части изображения. Помимо функцииimagesetpixelв примере используются еще две:
- imagecolorat- возвращает значение цвета в текущей точке.
- imagecolorsforindex- возвращает ассоциативный массив с индексами "red", "green", "blue" и "alpha". В качестве параметра передается цвет, полученный с помощью функцииimagecolorat
Пример 11.Затемнение изображения
$DARKNESS=40;
header ("Content-type: image/png");
$img = imagecreatefromjpeg("test.jpg");
for ($i=0;$i<100;$i++)
for ($j=0;$j<40;$j++) {
$x=$i+530-110;
$y=$j+10;
$rgb = imagecolorat($img, $x, $y);
$rgb = imagecolorsforindex($img, $rgb);
// Если значение цвета в текущей точке больше коэффицинта затемнения
// то просто вычитаем его. Иначе ставим в точку 0.
$rgb["red"] = $rgb["red"] > $DARKNESS ? $rgb["red"]-$DARKNESS : 0;
$rgb["green"] = $rgb["green"] > $DARKNESS ? $rgb["green"]-$DARKNESS : 0;
$rgb["blue"] = $rgb["blue"] > $DARKNESS ? $rgb["blue"]-$DARKNESS : 0;
$c=imagecolorallocate($img,$rgb["red"],$rgb["green"],$rgb["blue"]);
imagesetpixel($img, $x, $y, $c);
}
$white=imagecolorallocate($img,255,255,255);
imagestring($img,2,530-100,18,"www.codenet.ru",$white);
imagestring($img,2,530-100,28,"(c) 2005",$white);
imagepng($img);
imagedestroy($img);
Результат работы этой программы выглядит следующим образом:

Все примеры к этому уроку можно скачать здесь.
Назад | Оглавление | Далее
Оставить комментарий
Оставлять комментарии могут только зарегистрированные пользователи.
Если вы не являетесь зарегистрированным пользователем, то вам необходимо зарегистрироваться. Регистрация бесплатна. Если вы уже зарегистрированы на CodeNet, то вам необходимо ввести логин и пароль в верхней (Alt-U) части страницы.
Комментарии
1. Viktor Ohanyan / 20 марта 2008, 23:28:13

"Вывод линии. алгоритм Брезенхема (PHP)" - алгоритм полная туфта!

Зачем столько кода если можно вот-так.
<?php
function line($img,$x1,$y1,$x2,$y2,$color) {
if( $x2 > $y2 ) {
for( $x=0 ; $x<$x2; $x++ ) {
$y = (($x-$x1)*($y2-$y1))/($x2-$x1)+$y1;
imagesetpixel($img,$x,$y,$color);
$x1 = $x;
$y1 = $y;
}
} else {
for( $y=0 ; $y<$y2; $y++ ) {
$x = (($y-$y1)*($x2-$x1))/($y2-$y1)+$x1;
imagesetpixel($img,$x,$y,$color);
$x1 = $x;
$y1 = $y;
}
}
return ;
}
$x1 = 0;
$y1 = 0;
$x2 = 320;
$y2 = 240;
header ("Content-type: image/png");
$img = imagecreatetruecolor( $x2, $y2 );
$color = imagecolorallocate($img, 255, 255, 255);
line($img,$x1,$y1,$x2,$y2,$color);
imagepng($img);
imagedestroy($img);
?>
2. Morfei / 24 февраля 2006, 13:09:18

Может примеры и хорошие, но почему ни слова про imagestring?

imagestring(resource image, int x, int y, string text, int color);
3. kron / 12 октября 2005, 13:45:44

Пример очень полезный но лично мне осталось не ясно как к примеру мне нарисовать процентную шкалу для опроса, ведь эта чтука считает весь документ рисунком.


