Не сте регистриран! Регистрирайте се БЕЗПЛАТНО, за да използвате услугите на сайта!

   Рубрики
 
 
 
 

 Форуми
» SEO и оптимизация
» Всичко за PHP и Perl
» Всичко за C, C++ и .NET
» Всичко за Java и JSP
» Всичко за SQL и MySQL
» Всичко за XHTML и CSS
» Презентация на сайтове
 Обработка на изображения с PHP и GD - II
  1. Лентова графика - I
  2. Лентова графика - II
iwanov
     
Автор  iwanov (12.01.2008 13:39)  съобщение до автора
Погледнат  3110 пъти  добави към любими
Оценка  добави коментар
Гласове  --  изпрати на приятел
Коментари  (1)  абонирай се за PHP
    Страница 1 / 2

 



В този урок ще засегнем отново темата обработка на изображения с GD, като ще се спрем на създаване на лентова графика.

CODE
1
2
3
4
5
6
<?php
$size_x = 640;
$size_y = 480;
$title = 'People moving to the snow every winter';
$title2 = 'Head count (in 1.000)';
?>

Както и в предишния пример, първо сърраняваме в променливи хоризонталния и вертикалния размер на изображението. Останалата част от скрипта ще се мащабира правилно (освен фона), ако тези стойности бъдат променени. За да улесним нещата, в началото сме дефинирали статично и заглавията.

CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$values = array (
   
1999 => 5300,
   
2000 => 5700,
   
2001 => 6400,
   
2002 => 6700,
   
2003 => 6600,
   
2004 => 7100
);

$max_value = 8000;
$units = 500;
?>

Масиват $value дефинира набор от данни, от които ще черпи информация за изчертаването на лентите на нашата графика. Обикновено тези стойности не се записват константно в скриптовете, а стойностите се изпращат от друк източник, например база данни. Променливата $max_value дефинира максимална стойност в графиката и се използва за автоматично мащабиране на стойностите. Променливата $units дефинира разтоянието между вертикалните линии на координатната мрежа.

CODE
1
2
3
4
5
<?php
$img = imagecreatetruecolor($size_x, $size_y);
imageantialias($img, true);
imagealphablending($img, true);
?>

Както и преди създаваме изображение с 24 битов цвят и активираме изглаждането. Извикването на imagealphablending() не винаги е необходимо, тъй като стойността е true по подразбиране за изображенията с 24 битов цвят. Алфа смесването е техника за "смесване" на нови пиксели, които се добавят към изображението посредством неговия алфа канал. Тук трябва да използваме тази функция, защото искаме нашите ленти да са прозрачни (давайки възможност да се вижда фона на изображението). Прозрачността е цветовото свойство на PHP дефинирано в петия параметър на imagecolorallocatealpha() използвана по късно в скрипта.

CODE
1
2
3
4
5
<?php
$bg_image = '../images/chart-bg.png';
$bg = imagecreatefrompng($bg_image);
$sizes = getimagesize($bg_image);
?>

Горната секция на скрипта зарежда изображението за фон чрез imagecreatefrompng(). На разположение са и подобни функции за четене на JPEG файлове (iamgecreate-fromjpg()) и GIF файлове (imagecreatefromgif()). getimagesize() е функция връщата масив съдържащ широчината и височината на дадено изображение както и допълнителна информация. Широчината и височината са първите елементи от този масив. Третият елемент е текстов низ width='640' heiht='480', който може да бъде вграждан при нужда в HTML. Четвъртият елемент е типът на изображението. PHP може да определя размерите на около 18 различни видове файлове в това число PNG, JPEG, GIF, SWF (флаш файлове), TIFF, BMP и PSD (Photoshop). Чрез функцията image_type_to_mime_type() можете да преобразувате типа от масива във валиден mime тип от рода на image/png или application/x-shockwave-flash.

CODE
1
2
3
4
5
6
7
<?php
imagecopyresampled(
 
$img, $bg,
 
0, 0, 0, 0,
 
$size_x, $size_y, $sizes[0], $sizes[1]
)
;
?>

Копираме PNG изображението които прочитаме от файла в целевото изображение - нашата графика. Функцията изисква 10 параметара. Първите два са манипулаторат на изображението-дестинация и манипулаторът на зареденото PNG изображение, следвани от четири набора координати: горните леви координати на изображението-дестинация, горните леви координати на изображението-източник, долните десни координати на изображението-дестинация и долните десни координати на изображението-източник. Отделна част от изображението-източник може да бъде копирана посредством копиране на съответните му координати. Функцията imagecopyresized() също копира изображения и тя в по-бърза, но резултатът не е толкова добър, тъй като алгоритамът не е така мощен.

CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
/* Област на графиката */
$background = imagecolorallocatealpha($img, 127, 127, 192, 32);
imagefilledrectangle(
 
$img,
 
20, 20, $size_x - 20, $size_y 80,
 
$background
);
imagefilledrectangle(
$img, 20, $size_y - 60, $size_x - 20, $size_y 20,
$background
);
?>

Изчертаваме двете синкави области върху фоновото изображение: едната за графиката и една за заглавието. Тъй като искаме областите да са прозрачни, създаваме цвят с алфа стойност 32. Алфа стойността трябва да бъде между 0 и 127, като нулата означава напълно непрозрачно, а 127 означава напълно прозрачно.

CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
/* Стойности */
$barcolor = imagecolorallocatealpha($img, 0, 0, 128, 80);
$spacing = ($size_x - 140) / count($values);
$start_x = 120;

foreach ($values as $key => $value) {
   
$x1 = $start_x +0.2 * $spacing;
   
$x2 = $start_x +0.8 * $spacing;

   
$y1 = $size_y -120;
   
$y2 = $y1 - (($value / $max_value) * ($size_y -160));

   
imagefilledrectangle($img, $x1, $y1, $x2, $y2, $barcolor);
   
$start_x += $spacing;
}
?>

Изчертаваме ленти (както са дефинирани в масива $value, създаден в началото на скрипта) чрез imagefilledrectangle(). Разтоянието между лентите изчисляваме като разделяме широчината на разположение за лентите (широчината на изображението минус широчината на страничните полета, които сумарно са 140-120 отляво и 20 отдясно) на броя на стойностите в масива. Цикалът инкрементира компонента $star_x със съответната стойност и лентата се изчертава между 20-я и 80-я процент от предоставеното и хоризонтално пространство. Вертикално се взима предвид максималната стойност за изчертаване и размерат се равнява по нея.



  Следваща страница >> 


Ключови думи: PHP GD изображение фон прозрачни ленти truetype текст


Още уроци от тази рубрика


 
  • Подобни теми от myLinks
 

 За автора: iwanov  
Казвам се Галин Иванов и обичам да се занимавам с програмиране и като цяло с компютри. Разбирам от HTML, CSS, PHP и MySQL. Старая се да научавам постоянно нови неща от IT сферата.
   
 1 посетител чете този урок (0 потребители и 1 гост)  
Активни потребители: ---
   
  

Еmail  
 

Първо, здравейте искам да кажа, че кода е пълен с грешки!
Второ мога да ви кажа откъде е преписан!
 
PHP 5 Професионално програмиране на Брус Перънс

Ето ви работещ код за GIF изображение с име images/stat.gif

CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
<?php
$size_x = 640;
$size_y = 480;
$title = 'People moving to the snow every winter';
$title2 = 'Head count (in 1.000)';

$values = array (
   
1999 => 5300,
   
2000 => 5700,
   
2001 => 6400,
   
2002 => 6700,
   
2003 => 6600,
   
2004 => 7100
);

$max_value = 8000;
$units = 500;

$img = imagecreatetruecolor($size_x, $size_y);
imageantialias($img, true);
imagealphablending($img, true);

$bg_image = 'images/stat.gif';
$bg = imagecreatefromgif($bg_image);
$sizes = getimagesize($bg_image);

imagecopyresampled(
 
$img, $bg,
 
0, 0, 0, 0,
 
$size_x, $size_y, $sizes[0], $sizes[1]
)
;

/* &
#206;áëàñò íà ãðàôèêàòà */
$background = imagecolorallocatealpha($img, 127, 127, 192, 32);
imagefilledrectangle(
 
$img,
20, 20, $size_x - 20, $size_y - 80,
$background
);
imagefilledrectangle(
$img, 20, $size_y - 60, $size_x - 20, $size_y - 20,
$background
);

$barcolor = imagecolorallocatealpha($img, 0, 0, 128, 80);
$spacing = ($size_x - 140) / count($values);
$start_x = 120;

foreach ($values as $key => $value) {
    $x1 = $start_x +0.2 * $spacing;
    $x2 = $start_x +0.8 * $spacing;

    $y1 = $size_y -120;
    $y2 = $y1 - (($value
/ $max_value) * ($size_y -160));

   
imagefilledrectangle($img, $x1, $y1, $x2, $y2, $barcolor);
   
$start_x += $spacing;
}

/* &
#204;ðåæà */
$black = imagecolorallocate($img, 0, 0, 0);
$grey = imagecolorallocate($img, 128, 128, 192);
for ($i = $units; $i <= $max_value; $i += $units) {
   
$x1 = 110;
   
$y1 = $size_y -120 - (($i / $max_value) * ($size_y -160));
    $x2 = $size_x -20;
    $y2 = $y1;

    imageline($img, $x1, $y1, $x2, $y2, ($i % (2 * $units)) == 0 ? $black : $grey);
}

/* &#206;ñè */
imageline($img, 120, $size_y -120, 120, 40, $black);
imageline($img, 120, $size_y -120, $size_x -20, $size_y- 120, $black);

/* &
#199;àãëàâèå */
$c_x = $size_x / 2;
$c_y = $size_y -40;

$box = imagettfbbox(20, 0, 'arial.ttf', $title);
$sx = $box[4] - $box[0];
$sy = $box[5] + $box[1];
imagettftext($img, 20, 0, $c_x - $sx
/ 2, $c_y - ($sy / 2), $black, 'arial.ttf', $title);

$c_x = 50;
$c_y = ($size_y -60)
/ 2;

$box = imagettfbbox(14, 90, 'arial.ttf', $title2);
$sx = $box[4] - $box[0];
$sy = $box[5] + $box[1];
imagettftext($img, 14, 90, $c_x - ($sx / 2), $c_y - ($sy / 2), $black, 'arial.ttf', $title2);

/* &
#197;òèêåòè */
$c_y = $size_y -100;
$start_x = 120;

foreach ($values as $label => $dummy) {
   
$box = imagettfbbox(12, 0, 'arial.ttf', $label);
   
$sx = $box[4] - $box[0];
   
$sy = $box[5] + $box[1];
   
$c_x = $start_x + (0.5 * $spacing);
 
   
imagettftext(
       
$img, 12, 0, $c_x - ($sx / 2),
        $c_y - ($sy
/ 2),
       
$black, 'arial.ttf', $label
   
);

   
$start_x += $spacing;
}

$r_x = 100;
for ($i = 0; $i <= $max_value; $i += ($units * 2)) {
   
$c_y = $size_y -120 - (($i / $max_value) * ($size_y -160));

    $box = imagettfbbox(12, 0, 'arial.ttf', $i
/ 100);
   
$sx = $box[4] - $box[0];
   
$sy = $box[5] + $box[1];
 
   
imagettftext(
       
$img, 12, 0,
       
$r_x - $sx, $c_y - ($sy / 2),
        $black, 'arial.ttf', $i
/ 100
   
);
}

/* &
#200;çâåæäàíå â áðàóçàðà */
header('Content-type: image/png');
imagepng($img);
?>

  azerot на 20.07.2008 00:43

 

 
  • Интересно от Софтуер
 



IT-PLACE.NET © 2004 - 2008