Справочник функций

Ваш аккаунт

Логин:
Пароль:
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:
Убрать блок ВКонтакте навсегда

Последние темы форума

Показать новые сообщения »

Почтовая рассылка



Подписчиков: 19086
Последний выпуск: 12.01.2012

Рисование точки и линии

Рисование точки

Автор: mike, www.codenet.ru
9 февраля 2005 года

В этом уроке помимо стандартных способов рисования точек и линий рассматриваются более сложные - рисование сглаженной линии, рисование линий произвольной ширины. Кроме того, приведен пример частичного затемнения картинки для создании подписи.

Для рисования точки используется функцияimagesetpixel:

Код:
int imagesetpixel ( resource image, int x, int y, int color)

imagesetpixel() рисует на изображенииimageточку с координатамx,yи цветомcolor. Верхний левый угол имеет координаты 0,0.

Пример 7.Рисование точки

Код:
header ("Content-type: image/png");
$img = imagecreatetruecolor(320, 240);
$ink = imagecolorallocate($img, 255, 255, 255);
imagesetpixel($img,160,120,$ink);
imagepng($img);
imagedestroy($img);

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

С помощью точки можно нарисовать что угодно. Для иллюстрации рассмотрим такую простую программу:

Пример 8.

Код:
header ("Content-type: image/png");
$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.Рисование линии

Код:
header ("Content-type: image/png");
$img = imagecreatetruecolor(320, 240);
$ink = imagecolorallocate($img, 255, 255, 255);
imageline($img,0,0,320-1,240-1,$ink);
imagepng($img);
imagedestroy($img);

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

Рисование точки и линии

См. также:

Рисование линии произвольной ширины

Иногда появляется необходимость рисованиялинии произвольной толщины(пример будет рассмотрен в уроке 13). Функции рисования такой линии нет, но мы может сами написать ее:

Пример 10.Рисование линии произвольной толщины.

Код:
function imagelinethick($image, $x1, $y1, $x2, $y2, $color, $thick = 1) {
    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.Затемнение изображения

Код:
// Коэффициент затемнения. Вычитается из каждой компоненты (R,G и B)
$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
Мне нравитсяМне не нравится

Пример очень полезный но лично мне осталось не ясно как к примеру мне нарисовать процентную шкалу для опроса, ведь эта чтука считает весь документ рисунком.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог