В прошлый раз я говорил об использовании GD для создания различных геометрических фигур и цветов заливки. Одна из наиболее сложных ситуаций намеренно оставлена на потом, а именно цвет заливки произвольных многоугольников и произвольных многоугольников.
<?
Header("Тип контента: изображение/png");
$im = ImageCreate (200, 100);
$col_blk = ImageColorAllocate($im, 0,0,0);
$col_grn = ImageColorAllocate($im, 0,255,0);
$parray = массив (40,10,60,10,70,20,60,50,40,50,30,20);
//Определим массив, 12 членов которого представляют собой горизонтальные и вертикальные координаты 6 точек.
ImagePolygon($im,$parray,6,$col_grn);
// Это функция для рисования произвольных многоугольников. $parray — это только что определенный массив.
// 6 означает шесть очков. Обратите внимание, что шесть соединенных точек образуют шестиугольник.
// Нет необходимости искусственно добавлять точку в конце, такую же, как первая точка, чтобы замкнуть фигуру.
ИзображениеPNG ($ im);
ImageDestroy($im);
?>
Надо было подумать о функции заливки цветом любого многоугольника:
<?
Header("Тип контента: изображение/png");
$im = ImageCreate (200, 100);
$col_blk = ImageColorAllocate($im, 0,0,0);
$col_orn = ImageColorAllocate($im, 255,192,0);
$col_yel = ImageColorAllocate($im, 255,255,0);
$col_red = ImageColorAllocate($im, 255,0,0);
$col_grn = ImageColorAllocate($im, 0,255,0);
$col_blu = ImageColorAllocate($im, 0,0,255
$parray = массив(40,10,60,10,70,20,60,50,40,50,30,20);
ImageFilledPolygon($im,$parray,6,$col_grn);
ИзображениеPNG ($ im);
ImageDestroy($im);
?>
Хм. Теперь мы можем писать на изображении. Но пока не стоит слишком волноваться: написание китайских иероглифов потребует некоторых хлопот.
Это будет объяснено постепенно позже. Давайте посмотрим, как просто писать западные символы.
<?
Header("Тип контента: изображение/png");
$im = ImageCreate (200, 250);
$col_blk = ImageColorAllocate($im, 0,0,0);
$col_orn = ImageColorAllocate($im, 255,192,0);
$str="Это тест.";
ImageString($im,1,10,10,$str,$col_orn);
ImageString($im,2,10,30,$str,$col_orn);
ImageString($im,3,10,60,$str,$col_orn);
ImageString($im,4,10,100,$str,$col_orn);
ImageString($im,5,10,150,$str,$col_orn);
// Здесь ImageString вызывается пять раз подряд в разных местах.
//Строка $str выводится шрифтами от маленького до большого.
// Функция ImageString поддерживает только пять шрифтов (1~5)
ИзображениеPNG ($ im);
ImageDestroy($im);
?>
Посмотрите еще раз:
<?
//Header("Тип контента: изображение/png");
$im = ImageCreate (200, 250);
$col_blk = ImageColorAllocate($im, 0,0,0);
$col_orn = ImageColorAllocate($im, 255,192,0);
$str="Это тест.";
ImageStringUp($im,1,10,180,$str,$col_orn);
ImageStringUp($im,2,20,180,$str,$col_orn);
ImageStringUp($im,3,40,180,$str,$col_orn);
ImageStringUp($im,4,70,180,$str,$col_orn);
ImageStringUp($im,5,110,180,$str,$col_orn);
//Имя функции меняется на ImageStringUp, а ее использование остается неизменным.
// предназначен для вывода вертикального текста.
ИзображениеPNG ($ im);
ImageDestroy($im);
?>
При использовании функции вывода символов, если вы можете знать ширину и высоту, которую символы разных типов шрифта занимают в изображении,
Как было бы удобно упорядочить положение выводимых символов! PHP предоставляет нам: ImageFontWidth() и
ImageFontHeight(), его параметр очень простой, всего один: номер шрифта. Например, ImageFontWidth(5)
Он предназначен для получения ширины каждого символа шрифта размера 5, а ImageFontHeight(3) — для получения высоты каждого символа шрифта размера 3. Это настолько просто, что я не буду приводить пример. Позже он будет использоваться в последующем коде.
Подобно выводу строк, ImageChar и ImageCharUp выводят один символ. Они используются меньше и могут даже не использоваться — независимо от символов или строк, просто используйте ImageString и ImageStringUp!
Далее я буду использовать часть кода, который я использовал для рисования диаграмм анализа K-линий акций, чтобы систематически применять упомянутое выше содержимое. Поскольку здесь используется база данных, мы не можем предоставить исходный код всем желающим для тестирования. Мы можем только построить некоторые данные для моделирования условий фондового рынка, полученные из базы данных. Поскольку здесь может быть не так много людей, которые понимают К-линию акций, вы, возможно, не знаете, как построить график К-линии. Однако я не могу здесь говорить о специфике К-линии, могу лишь представить ряд методов. После того, как вы закончите рисовать, вы обязательно сможете сказать, что видели подобные картинки раньше.
<?php
Header("Тип контента: изображение/png");
$im = ImageCreate(640,260);
$bkground = ImageColorAllocate($im,255,255,255);
$data = ImageColorAllocate($im,0,0,0);
$gird = ImageColorAllocate($im,200,200,160);
$upline = ImageColorAllocate($im,255,0,0);
$dnline = ImageColorAllocate($im,0,175,175);
$d5line = ImageColorAllocate($im,255,127,0);
$d20line = ImageColorAllocate($im,0,0,127);
$d10line = ImageColorAllocate($im,255,0,255);
// Сначала определим цвета, используемые для рисования различных объектов.
for($i=20;$i<=220;$i+=25)
ImageLine($im, 60, $i, 560, $i, $gird);
for($j=60;$j<=560;$j+=25)
ImageLine($im, $j, 20, $j, 220, $gird);
// Заранее вычисляем положение и ширину сетки и используем цикл for для рисования линии, что избавляет от многих хлопот.
$ззг=10,55;
$zzd=7,63;
$lzg=10350;
// Гипотетические данные фондового рынка,
// $zzg — самая высокая цена за анализируемый период, предполагая, что она равна 10,55 юаней.
//$zzd — самая низкая цена за анализируемый период, предполагая, что она равна 7,63 юаня.
// $lzg — самый высокий объем торгов за период, который необходимо проанализировать, предполагая, что он составляет 10350 лотов.
// Это важные данные для расчета «тикания» координатной сетки.
$bl=$zzg-$zzd;
// Разница между самой высокой и самой низкой ценой. По его отношению к общей высоте сетки,
// Вы можете получить фактическую ценовую позицию в сетке.
for($i=1;$i<=7;$i++)
{
$y=$i*25-10;
// Вычисляем соответствующую высоту (ординату) масштаба метки на основе положения линий сетки.
$str=Number_Format($zzg-($i-1)/6*$bl,2,".",",");
// Вычисляем цену, соответствующую каждой отметке, и форматируем строку.
$x=55-ImageFontWidth(2)*StrLen($str);
// Вычисляем соответствующую абсциссу на основе ширины, которую будет занимать эта строка.
ImageString($im, 2,$x, $y,$str, $data);
//Запишите эту строку.
}
$str=Number_Format($lzg,0,".",",");
ImageString($im,2,564,164,$str,$data);
$str=Number_Format($lzg/2,0,".",",");
ImageString($im,2,564,189,$str,$data);
// Так как шкалы для записи объема торгов всего две, писать в цикле нерентабельно.
// Если число относительно велико, следует также использовать цикл.
// Поскольку график K-линии требует рисования бесчисленного количества маленьких K-линий, нарисуйте небольшой K-линию как функцию
функция kline($img,$kp,$zg,$zd,$sp,$cjl,$ii)
// Параметры: $img image $kp $zg $zd $sp — цена открытия, максимальная, минимальная и цена закрытия;
// объем торговли $cjl; счетчик $ii, указывающий порядковый номер бара K-линии.
{
глобальный $bl,$zzd,$lzg;
// Объявляем три переменные $bl, $zzd и $lzg, используемые в этой функции, как глобальные переменные.
$h=150; //Высота области столбца K-строки равна 150.
$hh=200; //Общая высота области столбца K-линии и области столбца объема равна 200.
если($sp<$kp)
$linecolor = ImageColorAllocate($img,0,175,175);
// Если цена закрытия ниже цены открытия, это отрицательная линия, окрашенная в голубой цвет.
еще
$linecolor = ImageColorAllocate($img,255,0,0);
// В противном случае это положительная линия, используйте красный цвет.
$х=58+$ii*4;
// Вычисляем абсциссу по номеру бара K-линии.
$y1=20+$h-($kp-$zzd)/$bl*$h;
// Рассчитываем соответствующую вертикальную координату на основе цены открытия.
$y2=20+$h-($sp-$zzd)/$bl*$h;
// Вычисляем соответствующую вертикальную координату на основе цены закрытия.
$y3=20+$h-($zg-$zzd)/$bl*$h;
// Вычисляем соответствующую вертикальную координату на основе самой высокой цены.
$y4=20+$h-($zd-$zzd)/$bl*$h;
// Вычисляем соответствующую вертикальную координату на основе самой низкой цены.
$y5=20+$hh-$cjl/$lzg*($hh-$h);
// Вычисляем соответствующую вертикальную координату на основе объема торгов.
if($y1<=$y2) ImageFilledRectangle($img,$x-1,$y1,$x+1,$y2,$linecolor);
иначе ImageFilledRectangle($img,$x-1,$y2,$x+1,$y1,$linecolor);
//По оси абсцисс от минус 1 до плюс 1, а интервал равен 3. То есть нарисуйте небольшой заполненный прямоугольник шириной 3.
//Высота и вертикальная координата определяются ценами открытия и закрытия.
// После тестирования выяснилось, что эта функция должна записывать координаты верхней левой точки раньше координат нижней правой точки.
// Вместо автоматического определения, какая из двух точек является верхней левой или нижней правой.
ImageFilledRectangle($img,$x-1,$y5,$x+1,220,$linecolor);
//Рисуем цилиндр объема на основе объема торгов.
ImageLine($img,$x,$y3,$x,$y4,$linecolor);
// Рисуем верхнюю и нижнюю линии тени на основе самой высокой и самой низкой цены.
}
// Попробуйте нарисовать один. Открытие составило 8,50, самое высокое - 8,88, самое низкое - 8,32 и закрытие - 8,80, при этом было продано 6578 лотов.
клин($im,8.50,8.88,8.32,8.80,6578,1);
//Рисуем еще один. Открытие составило 8,80, самое высокое - 9,50, самое низкое - 8,80 и закрытие - 9,50, при этом было продано 8070 лотов.
// Какой великий Янсянь с непокрытой головой и босыми ногами!
клин($im,8.80,9.50,8.80,9.50,8070,2);
// Еще одна отрицательная линия. Открытие составило 9,80, самое высокое - 9,80, самое низкое - 8,90 и закрытие - 9,06, при этом было продано 10 070 лотов.
// Оплаченный! Как приятно было выбросить его вчера.
kline($im,9.80,9.80,8.90,9.06,10070,3
// ……
ImagePNG($im);
ImageDestroy($im);
?>
Конечно, было бы слишком хлопотно записывать такие данные на каждый день. Я извлекаю данные из базы данных.
Это все на этот раз.