Главная » Полезные статьи » Язык PHP » Работа с изображениями в PHP [16 уроков]
Распечатать статью

Работа с изображениями в PHP [16 уроков]

Эти уроки помогут вам разобраться с тем, как средствами PHP и библиотеки GD создавать разного рода изображения — счетчики, диаграммы, графики.

Я буду стараться публиковать новые уроки по понедельникам и постараюсь рассказать не только об основах, но о некоторых тонкостях, например о том как правильно узнать версию библиотеки GD, как рисовать сглаженные линии и многое другое.
Урок 1 — Создание изображения
Урок 2 — Рисование точки
Урок 3 — Рисование линии
Урок 4 — Рисование прямоугольника
Урок 5 — Рисование эллипса и круга
Урок 6 — Работа с полигонами
Урок 7 — Заливка замкнутой области
Урок 8 — Заливка сложной области
Урок 9 — Построение круговой диаграммы
Урок 10 — Построение гистограммы
Урок 11 — Построение графика
Урок 12 — Изменение размеров изображения
Урок 13 — Сглаживание изображения
Урок 14 — Как узнать версию библиотеки GD

Изображение создается с помощью функций imagecreate и imagecreatetruecolor.

Функция imagecreate создает изображение использующее палитру.

Каждой точке такого изображения присваивается номер цвета — от 0 до 255. Каждый цвет описывается в палитре. Таким образом изображение не может содержать более 256 цветов. В палитре каждый цвет описывается с помощью трех байт — один для красной компоненты (R), один для зеленой (G) и один для синей (B).

При использовании таких изображений целесообразно, в результате работы, генерировать GIF или PNG изображения.

Функция imagecreatetruecolor создает полноцветное изображение.

Каждая точка полноцветного изображения самостоятельно определяет свой цвет. Для хранения каждой точки используется как минимум три байта — один для красной компоненты (R), один для зеленой (G) и один для синей (B). Иногда добавляется четвертый байт. Он может быть добавлен как просто для повышения производительности, так и для определения прозрачности точки.

Такое изображение занимает больше места в памяти и в результате целесообразно генерировать JPEG или PNG изображение.
Обоим функциям передается два параметра — ширина и высота изображения. Обе функции возвращают идентификатор изображения:

Пример 1. Создание полноцветного изображения размером 320×240:
$img=imagecreatetruecolor(320,240);

Для получения результата необходимо сделать еще два действия — определить, как минимум, один цвет (в изображениях использующих палитру, первый цвет станет цветом фона) и запаковать и отправить изображение.
Выделение цветов
Для выделения цвета используется функция imagecolorallocate. В качестве параметров ей передается идентификатор изображения и три компоненты цвета (R,G и B). Значение каждой компоненты может изменятся от 0 до 255.

Пример 2. Выделение цветов
// Черный цвет
$color1=imageolorallocate($img,0,0,0);

// Белый цвет
$color2=imagecolorallocate($img,255,255,255);

// Зеленый цвет
$color3=imagecolorallocate($img,0,255,0);

Если вы привыкли задавать цвет так, как это делается в HTML, то можете использовать следующую функцию:
function htmlcolor($img,$color) {
sscanf($color, «%2x%2x%2x», $red, $green, $blue);
return ImageColorAllocate($img,$red,$green,$blue);
return($c);
}

$red=htmlcolor($img,»FF0000″);
Сохранения изображения

После того, как изображение сформировано, необходимо передать его в понятном для браузера формате — GIF, JPEG или PNG. Для этого используются функции imagegif, imagejpeg и imagepng

Пример 3. Передача изображения в стандартный вывод в формате PNG
imagepng();

Если вы хотите сохранить изображение в файл, то должны передать его имя в качестве параметра функции, например:

Пример 4. Сохранение изображения в файл в формате JPEG
imagejpeg(«newimage.jpg»);
Примеры

Пример 5. Создания изображения, использующего палитру.
header(«Content-type: image/png»);
$img = imagecreate(320, 240);
$background_color = imagecolorallocate($img, 155, 255, 255);
$text_color = imagecolorallocate($img, 233, 14, 91);
imagestring($img, 2, 5, 5, «This is example», $text_color);
imagepng($img);
imagedestroy($img);
?>

Hint: Помните! Cкрипт генерирующий изображение не может выводить никаких текстовых сообщений. Не оставляйте пустых строк перед «»

Пример 6. Создания изображения, использующего палитру.
header («Content-type: image/png»);
$img = imagecreatetruecolor(320, 240);
$text_color = imagecolorallocate($img, 233, 14, 91);
imagestring($img, 2, 5, 5, «This is example», $text_color);
imagepng($img);
imagedestroy($img);
?>

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

Для рисования точки используется функция 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:
int imageline ( resource image, int x1, int y1, int x2, int y2, int color)

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);
?>
Пример 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);
?>

Самый простой способ нарисовать прямоугольник — это воспользоваться функцией imagerectagle:
int imagerectangle ( resource image, int x1, int y1, int x2, int y2, int color)

Функция imagerectangle() рисует прямоугольник цвета color. Координаты верхнего левого угла прямоугольника — x1:y1, координаты нижнего правого угла прямоугольника — x2:y2. Верхний левый угол изображения имеет координаты 0:0.

Пример 12. Рисование прямоугольника:
header («Content-type: image/png»);
$im = imagecreatetruecolor(320, 240);
$ink = imagecolorallocate($im, 255, 255, 255);

// Стандартный прямоугольник
imagerectangle($im,80,60,240,180,$ink);

imagepng($im);
imagedestroy($im);
?>

Для рисования эллипса используется функция imageellipse:
int imageellipse (resource image, int cx, int cy, int w, int h, int color)

где,
image — идентификатор изображения;
cx, cy — координаты центра эллипса;
w — ширина эллипса (диаметр);
h — высота эллипса (диаметр);
color — цвет.

Пример 19. Рисование эллипса:
header («Content-type: image/png»);
$im = imagecreatetruecolor(320, 240);
$ink = imagecolorallocate($im, 255, 255, 255);

imageellipse($im,160,120,200,150,$ink);

imagepng($im);
imagedestroy($im);
?>
Рисование окружности и круга

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

Пример 24. Вывод круга и окружности:
header («Content-type: image/png»);
$im = imagecreatetruecolor(320, 240);
$ink = imagecolorallocate($im, 255, 255, 255);
$red = imagecolorallocate($im, 255, 0, 0);

// Круг
imagefilledarc($im,110,110,100,100,0,360,$red,IMG_ARC_PIE);

// Окружность
imagearc($im,210,130,100,100,0,360,$ink);

imagepng($im);
imagedestroy($im);
?>

Полигон — это абстрактная геометрическая фигура, на которой основывается вся трехмерная компьютерная графика. С греческого языка слово «полигон» переводится как многоугольник.

Для рисования полигона используется функция imagepolygon.
int imagepolygon ( resource image, array points, int num_points, int color )

где,
image — идентификатор изображения;
points — массив точек;
num_points — количество точек в полигоне;
color — цвет.

Массив точек содержит X и Y координату каждой точки. Таким образом, для трех точек, массив содержит шесть элементов: Array( X1, Y1, X2, Y2, X3, Y3)

Пример 25. Вывод самого простого полигона (треугольник):
header («Content-type: image/png»);
$im = imagecreatetruecolor(320, 240);
$ink = imagecolorallocate($im, 255, 255, 255);

imagepolygon($im, Array(
100,100,
120,180,
210,160,
), 3, $ink);

imagepng($im);
imagedestroy($im);
?>

Для заливки замкнутой области используются функции imagefill и imagefilltoborder.

Функция imagefill закрашивает все прилегающие пиксели, цвет которых совпадает с цветом начальной точки, а функция imagefilltoborder закрашивает все прилегающие пиксели, цвет которых не совпадает с цветом заданным с помощью четвертого параметра — border
int imagefill ( resource image, int x, int y, int color )

где,
image — идентификатор изображения;
x,y — координаты точки, с которой будет начата заливка;
color — цвет.
int imagefilltoborder ( resource image, int x, int y, int border, int color )

где,
image — идентификатор изображения;
x,y — координаты точки, с которой будет начата заливка;
border — цвет границы.
color — цвет.

Пример 27. Заливка замкнутой области с помощью функции imagefill:
header («Content-type: image/png»);

$im = imagecreatetruecolor(320, 240);
$red = imagecolorallocate($im, 255, 0, 0);
$green = imagecolorallocate($im, 0, 255, 0);
$blue = imagecolorallocate($im, 0, 0, 255);

imagerectangle($im,50,50,270,190,$blue);
imagerectangle($im,100,100,220,130,$red);

imagefill($im,160,120,$green);

imagepng($im);
imagedestroy($im);
?>

Для заливки сложной замкнутой области удобно использовать функцию imagefilledpolygon:
int imagefilledpolygon ( resource image, array points, int num_points, int color )

где,
image — идентификатор изображения;
points — массив точек;
num_points — количество точек в полигоне;
color — цвет заливки.

Массив точек содержит X и Y координату каждой точки. Таким образом, для трех точек, массив содержит шесть элементов: Array( X1, Y1, X2, Y2, X3, Y3)

Пример 29. Вывод самого простого полигона (треугольник):
header («Content-type: image/png»);
$im = imagecreatetruecolor(320, 240);
$ink = imagecolorallocate($im, 255, 255, 255);

imagefilledpolygon($im, Array(
100,100,
120,180,
210,160,
), 3, $ink);

imagepng($im);
imagedestroy($im);
?>

 

Пример 31: Вывод круговой диаграммы. Исходный текст с сокращенным количеством комментариев:
// Задаем входные данные ############################################

// Входные данные — три ряда, содержащие случайные данные.
// Деление на 2 и 3 взято для того чтобы передние ряды не
// загораживали задние.

// Массив $DATA[«x»] содержит подписи по оси «X»

$DATA=Array();
for ($i=0;$i<20;$i++) {
$DATA[0][]=rand(0,100*$i);
$DATA[1][]=rand(0,100*$i)/2;
$DATA[2][]=rand(0,100*$i)/3;
$DATA[«x»][]=$i;
}

// Функция вывода псевдо-трехмерного куба ###########################

// $im — идентификатор изображения
// $x,$y — координаты верхнего левого угла куба
// $w — ширина куба
// $h — высота куба
// $dx — смещение задней грани куба по оси X
// $dy — смещение задней грани куба по оси Y
// $c1,$c2,c3 — цвета видимых граней куба

function imagebar($im,$x,$y,$w,$h,$dx,$dy,$c1,$c2,$c3) {

if ($dx>0) {
imagefilledpolygon($im,
Array(
$x, $y-$h,
$x+$w, $y-$h,
$x+$w+$dx, $y-$h-$dy,
$x+$dx, $y-$dy-$h
), 4, $c1);

imagefilledpolygon($im,
Array(
$x+$w, $y-$h,
$x+$w, $y,
$x+$w+$dx, $y-$dy,
$x+$w+$dx, $y-$dy-$h
), 4, $c3);
}

imagefilledrectangle($im, $x, $y-$h, $x+$w, $y, $c2);
}

// Задаем изменяемые значения #######################################

// Размер изображения
$W=500;
$H=300;

// Псевдо-глубина графика
$DX=30;
$DY=20;

// Отступы
$MB=20; // Нижний
$ML=10; // Левый
$M=5; // Верхний и правый отступы. Они меньше, так как там нет текста

// Ширина одного символа
$LW=imagefontwidth(2);

// Подсчитаем количество элементов (столбиков) на графике
$count=count($DATA[0]);
if (count($DATA[1])>$count) $count=count($DATA[1]);
if (count($DATA[2])>$count) $count=count($DATA[2]);

// Подсчитаем максимальное значение
$max=0;
for ($i=0;$i<$count;$i++) {
$max=$max<$DATA[0][$i]?$DATA[0][$i]:$max;
$max=$max<$DATA[1][$i]?$DATA[1][$i]:$max;
$max=$max<$DATA[2][$i]?$DATA[2][$i]:$max;
}

// Увеличим максимальное значение на 10% (для того, чтобы столбик
// соответствующий максимальному значение не упирался в в границу
// графика
$max=intval($max+($max/10));

// Работа с изображением ############################################

// Создадим изображения
$im=imagecreate($W,$H);

// Задаем основные цвета

// Цвет фона (белый)
$bg[0]=imagecolorallocate($im,255,255,255);

// Цвет задней грани графика (светло-серый)
$bg[1]=imagecolorallocate($im,231,231,231);

// Цвет левой грани графика (серый)
$bg[2]=imagecolorallocate($im,212,212,212);

// Цвет сетки (серый, темнее)
$c=imagecolorallocate($im,184,184,184);

// Цвет текста (темно-серый)
$text=imagecolorallocate($im,136,136,136);

// Цвета для столбиков
$bar[2][0]=imagecolorallocate($im,255,128,234);
$bar[2][1]=imagecolorallocate($im,222,95,201);
$bar[2][2]=imagecolorallocate($im,191,65,170);
$bar[0][0]=imagecolorallocate($im,222,214,0);
$bar[0][1]=imagecolorallocate($im,181,187,65);
$bar[0][2]=imagecolorallocate($im,161,155,0);
$bar[1][0]=imagecolorallocate($im,128,234,255);
$bar[1][1]=imagecolorallocate($im,95,201,222);
$bar[1][2]=imagecolorallocate($im,65,170,191);

// Количество подписей и горизонтальных линий
// сетки по оси Y.
$county=10;

// Подравняем левую границу с учетом ширины подписей по оси Y
$text_width=strlen($max)*$LW;
$ML+=$text_width;

// Вывод фона графика
imageline($im, $ML, $M+$DY, $ML, $H-$MB, $c);
imageline($im, $ML, $M+$DY, $ML+$DX, $M, $c);
imageline($im, $ML, $H-$MB, $ML+$DX, $H-$MB-$DY, $c);
imageline($im, $ML, $H-$MB, $W-$M-$DX, $H-$MB, $c);
imageline($im, $W-$M-$DX, $H-$MB, $W-$M, $H-$MB-$DY, $c);

imagefilledrectangle($im, $ML+$DX, $M, $W-$M, $H-$MB-$DY, $bg[1]);
imagerectangle($im, $ML+$DX, $M, $W-$M, $H-$MB-$DY, $c);

imagefill($im, $ML+1, $H/2, $bg[2]);

// Вывод неизменяемой сетки (горизонтальные линии на
// нижней грани и вертикальные линии сетки на левой
// грани
for ($i=1;$i<3;$i++) {
imageline($im, $ML+$i*intval($DX/3),
$M+$DY-$i*intval($DY/3),
$ML+$i*intval($DX/3),
$H-$MB-$i*intval($DY/3),
$c);
imageline($im, $ML+$i*intval($DX/3),
$H-$MB-$i*intval($DY/3),
$W-$M-$DX+$i*intval($DX/3),
$H-$MB-$i*intval($DY/3),
$c);
}

// Пересчитаем размеры графика с учетом подписей и отступов
$RW=$W-$ML-$M-$DX;
$RH=$H-$MB-$M-$DY;

// Координаты нулевой точки графика
$X0=$ML+$DX;
$Y0=$H-$MB-$DY;

// Вывод изменяемой сетки (вертикальные линии сетки на нижней грани графика
// и вертикальные линии на задней грани графика)
for ($i=0;$i<$count;$i++) {
imageline($im,$X0+$i*($RW/$count),$Y0,$X0+$i*($RW/$count)-$DX,$Y0+$DY,$c);
imageline($im,$X0+$i*($RW/$count),$Y0,$X0+$i*($RW/$count),$Y0-$RH,$c);
}

// Горизонтальные линии сетки задней и левой граней.
$step=$RH/$county;
for ($i=0;$i<=$county;$i++) {
imageline($im,$X0,$Y0-$step*$i,$X0+$RW,$Y0-$step*$i,$c);
imageline($im,$X0,$Y0-$step*$i,$X0-$DX,$Y0-$step*$i+$DY,$c);
imageline($im,$X0-$DX,$Y0-$step*$i+$DY,
$X0-$DX-($ML-$text_width)/4,$Y0-$step*$i+$DY,$text);
}

// Вывод кубов для всех трех рядов
for ($i=0;$i<$count;$i++)
imagebar($im, $X0+$i*($RW/$count)+4-1*intval($DX/3),
$Y0+1*intval($DY/3),
intval($RW/$count)-4,
$RH/$max*$DATA[0][$i],
intval($DX/3)-5,
intval($DY/3)-3,
$bar[0][0], $bar[0][1], $bar[0][2]);

for ($i=0;$i<$count;$i++)
imagebar($im, $X0+$i*($RW/$count)+4-2*intval($DX/3),
$Y0+2*intval($DY/3),
intval($RW/$count)-4,
$RH/$max*$DATA[1][$i],
intval($DX/3)-5,
intval($DY/3)-3,
$bar[1][0], $bar[1][1], $bar[1][2]);

for ($i=0;$i<$count;$i++)
imagebar($im, $X0+$i*($RW/$count)+4-3*intval($DX/3),
$Y0+3*intval($DY/3),
intval($RW/$count)-4,
$RH/$max*$DATA[2][$i],
intval($DX/3)-5,
intval($DY/3)-3,
$bar[2][0], $bar[2][1], $bar[2][2]);

// Вывод подписей по оси Y
for ($i=1;$i<=$county;$i++) {
$str=intval(($max/$county)*$i);
imagestring($im,2, $X0-$DX-strlen($str)*$LW-$ML/4-2,
$Y0+$DY-$step*$i-imagefontheight(2)/2,
$str,$text);
}

// Вывод подписей по оси X
$prev=100000;
$twidth=$LW*strlen($DATA[«x»][0])+6;
$i=$X0+$RW-$DX;

while ($i>$X0-$DX) {
if ($prev-$twidth>$i) {
$drawx=$i+1-($RW/$count)/2;
if ($drawx>$X0-$DX) {
$str=$DATA[«x»][round(($i-$X0+$DX)/($RW/$count))-1];
imageline($im,$drawx,$Y0+$DY,$i+1-($RW/$count)/2,$Y0+$DY+5,$text);
imagestring($im,2, $drawx+1-(strlen($str)*$LW)/2 ,$Y0+$DY+7,$str,$text);
}
$prev=$i;
}
$i-=$RW/$count;
}

header(«Content-Type: image/png»);

// Генерация изображения
ImagePNG($im)

imagedestroy($im);
?>

Построение графика

В этом уроке мы рассмотрим пример построения графика по заданному множеству значений. Размер графика и размер подписи будет зависеть от размера изображения. (см. рисунки).

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

Единственное, на что стоит обратить внимание — это сглаживание. Сглаживание производится методом усреднения соседних значений. Значение каждой точки рассчитывается как средне-арифметическое пяти соседних значений:
r[x]=(v[x]+v[x-1]+v[x-2]+v[x+1]+v[x+2])/5

Для сглаживания точек в краях графика нам придется добавить по два дополнительных значения:
v[-1]=v[0];
v[-2]=v[0];
v[count+1]=v[count];
v[count+2]=v[count];

где, count — количество точек на графике

Пример 32: Построение графика.
// Задаем входные данные ############################################

// Входные данные — три ряда, содержащие случайные данные.
// Деление на 2 и 3 взято для того чтобы передние ряды не
// пересекались

// Массив $DATA[«x»] содержит подписи по оси «X»

$DATA=Array();
for ($i=0;$i<20;$i++) {
$DATA[0][]=rand(0,100);
$DATA[1][]=rand(0,100)/2;
$DATA[2][]=rand(0,100)/3;
$DATA[«x»][]=$i;
}

// Задаем изменяемые значения #######################################

// Размер изображения

$W=16384;
$H=8192;

// Отступы
$MB=20; // Нижний
$ML=8; // Левый
$M=5; // Верхний и правый отступы.
// Они меньше, так как там нет текста

// Ширина одного символа
$LW=imagefontwidth(2);

// Подсчитаем количество элементов (точек) на графике
$count=count($DATA[0]);
if (count($DATA[1])>$count) $count=count($DATA[1]);
if (count($DATA[2])>$count) $count=count($DATA[2]);

if ($count==0) $count=1;

// Сглаживаем графики ###############################################
if ($_GET[«smooth»]==1) {

// Добавим по две точки справа и слева от графиков. Значения в
// этих точках примем равными крайним. Например, точка если
// y[0]=16 и y[n]=17, то y[1]=16 и y[-2]=16 и y[n+1]=17 и y[n+2]=17

// Такое добавление точек необходимо для сглаживания точек
// в краях графика

for ($j=0;$j<3;$j++) {
$DATA[$j][-1]=$DATA[$j][-2]=$DATA[$j][0];
$DATA[$j][$count]=$DATA[$j][$count+1]=$DATA[$j][$count-1];
}

// Сглаживание графики методом усреднения соседних значений

for ($i=0;$i<$count;$i++) {
for ($j=0;$j<3;$j++) {
$DATA[$j][$i]=($DATA[$j][$i-1]+$DATA[$j][$i-2]+
$DATA[$j][$i]+$DATA[$j][$i+1]+
$DATA[$j][$i+2])/5;
}
}
}

// Подсчитаем максимальное значение
$max=0;

for ($i=0;$i<$count;$i++) {
$max=$max<$DATA[0][$i]?$DATA[0][$i]:$max;
$max=$max<$DATA[1][$i]?$DATA[1][$i]:$max;
$max=$max<$DATA[2][$i]?$DATA[2][$i]:$max;
}

// Увеличим максимальное значение на 10% (для того, чтобы столбик
// соответствующий максимальному значение не упирался в в границу
// графика
$max=intval($max+($max/10));

// Количество подписей и горизонтальных линий
// сетки по оси Y.
$county=10;

// Работа с изображением ############################################

// Создадим изображение
$im=imagecreate($W,$H);

// Цвет фона (белый)
$bg[0]=imagecolorallocate($im,255,255,255);

// Цвет задней грани графика (светло-серый)
$bg[1]=imagecolorallocate($im,231,231,231);

// Цвет левой грани графика (серый)
$bg[2]=imagecolorallocate($im,212,212,212);

// Цвет сетки (серый, темнее)
$c=imagecolorallocate($im,184,184,184);

// Цвет текста (темно-серый)
$text=imagecolorallocate($im,136,136,136);

// Цвета для линий графиков
$bar[2]=imagecolorallocate($im,191,65,170);
$bar[0]=imagecolorallocate($im,161,155,0);
$bar[1]=imagecolorallocate($im,65,170,191);

$text_width=0;
// Вывод подписей по оси Y
for ($i=1;$i<=$county;$i++) {
$strl=strlen(($max/$county)*$i)*$LW;
if ($strl>$text_width) $text_width=$strl;
}

// Подравняем левую границу с учетом ширины подписей по оси Y
$ML+=$text_width;

// Посчитаем реальные размеры графика (за вычетом подписей и
// отступов)
$RW=$W-$ML-$M;
$RH=$H-$MB-$M;

// Посчитаем координаты нуля
$X0=$ML;
$Y0=$H-$MB;

$step=$RH/$county;

// Вывод главной рамки графика
imagefilledrectangle($im, $X0, $Y0-$RH, $X0+$RW, $Y0, $bg[1]);
imagerectangle($im, $X0, $Y0, $X0+$RW, $Y0-$RH, $c);

// Вывод сетки по оси Y
for ($i=1;$i<=$county;$i++) {
$y=$Y0-$step*$i;
imageline($im,$X0,$y,$X0+$RW,$y,$c);
imageline($im,$X0,$y,$X0-($ML-$text_width)/4,$y,$text);
}

// Вывод сетки по оси X
// Вывод изменяемой сетки
for ($i=0;$i<$count;$i++) {
imageline($im,$X0+$i*($RW/$count),$Y0,$X0+$i*($RW/$count),$Y0,$c);
imageline($im,$X0+$i*($RW/$count),$Y0,$X0+$i*($RW/$count),$Y0-$RH,$c);
}

// Вывод линий графика
$dx=($RW/$count)/2;

$pi=$Y0-($RH/$max*$DATA[0][0]);
$po=$Y0-($RH/$max*$DATA[1][0]);
$pu=$Y0-($RH/$max*$DATA[2][0]);
$px=intval($X0+$dx);

for ($i=1;$i<$count;$i++) {
$x=intval($X0+$i*($RW/$count)+$dx);

$y=$Y0-($RH/$max*$DATA[0][$i]);
imageline($im,$px,$pi,$x,$y,$bar[0]);
$pi=$y;

$y=$Y0-($RH/$max*$DATA[1][$i]);
imageline($im,$px,$po,$x,$y,$bar[1]);
$po=$y;

$y=$Y0-($RH/$max*$DATA[2][$i]);
imageline($im,$px,$pu,$x,$y,$bar[2]);
$pu=$y;
$px=$x;
}

// Уменьшение и пересчет координат
$ML-=$text_width;

// Вывод подписей по оси Y
for ($i=1;$i<=$county;$i++) {
$str=($max/$county)*$i;
imagestring($im,2, $X0-strlen($str)*$LW-$ML/4-2,$Y0-$step*$i-
imagefontheight(2)/2,$str,$text);
}

// Вывод подписей по оси X
$prev=100000;
$twidth=$LW*strlen($DATA[«x»][0])+6;
$i=$X0+$RW;

while ($i>$X0) {
if ($prev-$twidth>$i) {
$drawx=$i-($RW/$count)/2;
if ($drawx>$X0) {
$str=$DATA[«x»][round(($i-$X0)/($RW/$count))-1];
imageline($im,$drawx,$Y0,$i-($RW/$count)/2,$Y0+5,$text);
imagestring($im,2, $drawx-(strlen($str)*$LW)/2, $Y0+7,$str,$text);
}
$prev=$i;
}
$i-=$RW/$count;
}

header(«Content-Type: image/png»);

// Генерация изображения
ImagePNG($im);

imagedestroy($im);
?>

Пример 33: Функция изменяющая размер изображения.
function imageresize($outfile,$infile,$neww,$newh,$quality) {

$im=imagecreatefromjpeg($infile);
$im1=imagecreatetruecolor($neww,$newh);
imagecopyresampled($im1,$im,0,0,0,0,$neww,$newh,imagesx($im),imagesy($im));

imagejpeg($im1,$outfile,$quality);
imagedestroy($im);
imagedestroy($im1);
}

imageresize(«»,»webcam.jpg»,320,240,75);

?>

Пример 36: Сглаживание изображения с помощью двукратного уменьшения.
// Ширина и высота изображения
$W=500*2;
$H=375*2;

// Исходный код построения карты России пропущен.
// Смотрите урок №8

$imd=imagecreatetruecolor($W/2,$H/2);
imagecopyresampled($imd,$im,0,0,0,0,$W/2,$H/2,$W,$H);
imagedestroy($im);

imagepng($imd);
imagedestroy($im);
?>

Столкнулся я в свое время с проблемой получений версии GD.

Такой вот извращенный способ получения версии библиотеки GD используется из-за того что при отсутствии GD функция gd_info() не работает, но при это функция function_exists() сообщает о том что функция существует.

Приведенный ниже код работает в PHP 4 и выше. Проверено — будет работать у всех!!

Пример 34: Получение версии библиотеки GD
function gdVersion() {
ob_start();
phpinfo(8);
$phpinfo=ob_get_contents();
ob_end_clean();
$phpinfo=stristr($phpinfo,»gd version»);
$phpinfo=stristr($phpinfo,»version»);

$end=strpos($phpinfo,»

 

Источник:   codingrus.ru

Вы можете оставить комментарий, или обратную ссылку на Ваш сайт.

Оставить комментарий

Похожие статьи