Da última vez falei sobre usar GD para criar diversas formas geométricas e preencher cores. Uma das situações mais complicadas é deliberadamente deixada para depois, que é a cor de preenchimento de polígonos arbitrários e polígonos arbitrários.
<?
Header("Tipo de conteúdo: imagem/png");
$im = ImagemCriar (200, 100);
$col_blk = ImageColorAllocate($im, 0,0,0);
$col_grn = ImageColorAllocate($im, 0,255,0);
$parray = array(40,10,60,10,70,20,60,50,40,50,30,20);
//Defina um array cujos 12 membros sejam as coordenadas horizontais e verticais de 6 pontos.
ImagePolygon($im,$parray,6,$col_grn);
// Esta é a função para desenhar polígonos arbitrários. $parray é o array que acabamos de definir.
// 6 significa seis pontos. Observe que os seis pontos conectados formam um hexágono.
// Não há necessidade de adicionar artificialmente um ponto no final que seja igual ao primeiro ponto para fechar a forma.
ImagemPNG($im);
ImagemDestroy($im);
?>
Você deveria ter pensado na função de preencher com cor qualquer polígono:
<?
Header("Tipo de conteúdo: imagem/png");
$im = ImagemCriar (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 = array(40,10,60,10,70,20,60,50,40,50,30,20);
ImageFilledPolygon($im,$parray,6,$col_grn);
ImagemPNG($im);
ImagemDestroy($im);
?>
Hum. Agora podemos escrever na imagem. Mas não fique muito animado ainda, pois escrever caracteres chineses será um pouco complicado.
Isto será explicado gradualmente mais tarde. Vamos dar uma olhada em como escrever personagens ocidentais de maneira simples.
<?
Header("Tipo de conteúdo: imagem/png");
$im = ImagemCriar (200, 250);
$col_blk = ImageColorAllocate($im, 0,0,0);
$col_orn = ImageColorAllocate($im, 255.192,0);
$str="Isto é um teste.";
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);
// Aqui, ImageString é chamado cinco vezes seguidas, em locais diferentes.
//A string $str é exibida em tamanhos de fonte de pequeno a grande.
// A função ImageString suporta apenas cinco fontes (1~5)
ImagemPNG($im);
ImagemDestroy($im);
?>
Olhe novamente:
<?
//Header("Tipo de conteúdo: imagem/png");
$im = ImagemCriar (200, 250);
$col_blk = ImageColorAllocate($im, 0,0,0);
$col_orn = ImageColorAllocate($im, 255.192,0);
$str="Isto é um teste.";
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);
//O nome da função é alterado para ImageStringUp e o uso permanece inalterado.
// é para gerar texto vertical.
ImagemPNG($im);
ImagemDestroy($im);
?>
Ao usar a função que gera caracteres, se você puder saber a largura e a altura que os caracteres de diferentes tipos de fonte ocupam na imagem,
Seria muito conveniente organizar a posição dos caracteres de saída! PHP nos fornece: ImageFontWidth() e
ImageFontHeight(), seu parâmetro é muito simples, só existe um: o número da fonte. Por exemplo ImageFontWidth(5)
É para obter a largura de cada caractere da fonte tamanho 5, e ImageFontHeight(3) é para obter a altura de cada caractere da fonte tamanho 3. É tão simples, então não darei um exemplo. Ele será usado no código subsequente.
Semelhante à saída de strings, ImageChar e ImageCharUp geram um único caractere. Eles têm menos usos e podem nem mesmo ser usados - independentemente de caracteres ou strings, basta usar ImageString e ImageStringUp!
A seguir, usarei parte do código que usei para desenhar gráficos de análise de ações da linha K para aplicar sistematicamente o conteúdo mencionado acima. Por envolver um banco de dados, não podemos trazer o código original para que todos possam levá-lo para teste. Só podemos construir alguns dados para simular as condições do mercado de ações obtidos no banco de dados. Como pode não haver muitas pessoas aqui que entendam a linha K das ações, você pode não saber como desenhar o gráfico da linha K. No entanto, não posso falar sobre as especificidades da linha K aqui, só posso apresentar uma série de métodos. Depois de terminar o desenho, você certamente saberá que já viu fotos como essa antes.
<?php
Header("Tipo de conteúdo: imagem/png");
$im = ImageCreate(640.260);
$bkground = ImageColorAllocate($im,255.255.255);
$dados = 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);
//Primeiro defina as cores usadas para desenhar vários objetos.
para($i=20;$i<=220;$i+=25)
ImageLine($im, 60, $i, 560, $i, $gird);
para($j=60;$j<=560;$j+=25)
ImageLine($im, $j, 20, $j, 220, $gird);
// Calcule a posição e a largura da grade antecipadamente e use um loop for para desenhar a linha, o que evita muitos problemas.
$zzg=10,55;
$zzd=7,63;
$lzg=10350;
// Dados hipotéticos do mercado de ações,
// $zzg é o preço mais alto durante o período a ser analisado, assumindo que seja 10,55 yuans.
//$zzd é o preço mais baixo do período em análise, assumindo que seja 7,63 yuans.
// $lzg é o maior volume de negociação durante o período que precisa ser analisado, assumindo que seja 10.350 lotes.
// Estes são dados importantes para calcular o "tick" da grade de coordenadas.
$bl=$zzg-$zzd;
// A diferença entre o preço mais alto e o preço mais baixo. De acordo com a sua relação com a altura total da grelha,
// Você pode obter uma posição de preço real na grade.
para($i=1;$i<=7;$i++)
{
$y=$i*25-10;
// Calcula a altura apropriada (ordenada) da escala do rótulo com base na posição das linhas da grade.
$str=Number_Format($zzg-($i-1)/6*$bl,2,".",",");
//Calcula o preço correspondente a cada marca e formata a string.
$x=55-ImageFontWidth(2)*StrLen($str);
//Calcula a abcissa apropriada com base na largura que esta string irá ocupar.
ImageString($im, 2,$x, $y,$str, $dados);
//Escreve esta string.
}
$str=Number_Format($lzg,0,".",",");
ImageString($im,2.564.164,$str,$dados);
$str=Number_Format($lzg/2,0,".",",");
ImageString($im,2.564.189,$str,$dados);
// Como existem apenas duas escalas para escrever o volume de negociação, não é rentável escrever em loop.
// Se o número for relativamente grande, um loop também deverá ser usado.
// Como um gráfico de linha K requer o desenho de inúmeras pequenas barras de linha K, desenhe uma pequena barra de linha K como uma função
função kline($img,$kp,$zg,$zd,$sp,$cjl,$ii)
// Parâmetros: $img imagem; $kp $zg $zd $sp é o preço de abertura, máximo, mínimo e fechamento;
// $cjl volume de negociação; $ii contador, indicando o número de série da barra da linha K.
{
global $bl,$zzd,$lzg;
// Declara as três variáveis $bl, $zzd e $lzg usadas nesta função como variáveis globais.
$h=150; //A altura da área da coluna da linha K é 150.
$hh=200; //A altura total da área da coluna da linha K e da área da coluna de volume é 200.
if($sp<$kp)
$linecolor = ImageColorAllocate($img,0,175,175);
// Se o preço de fechamento for inferior ao preço de abertura, é uma linha negativa, colorida em ciano
outro
$linecolor = ImageColorAllocate($img,255,0,0);
// Caso contrário, é uma linha positiva, use vermelho.
$x=58+$ii*4;
//Calcula a abscissa com base no número da barra da linha K.
$y1=20+$h-($kp-$zzd)/$bl*$h;
//Calcula a coordenada vertical correspondente com base no preço de abertura.
$y2=20+$h-($sp-$zzd)/$bl*$h;
//Calcula a coordenada vertical correspondente com base no preço de fechamento.
$y3=20+$h-($zg-$zzd)/$bl*$h;
//Calcula a coordenada vertical correspondente com base no preço mais alto.
$y4=20+$h-($zd-$zzd)/$bl*$h;
//Calcula a coordenada vertical correspondente com base no preço mais baixo.
$y5=20+$hh-$cjl/$lzg*($hh-$h);
// Calcula a coordenada vertical correspondente com base no volume de negociação.
if($y1<=$y2) ImageFilledRectangle($img,$x-1,$y1,$x+1,$y2,$linecolor);
senão ImageFilledRectangle($img,$x-1,$y2,$x+1,$y1,$linecolor);
//A abscissa é menos 1 até mais 1 e o span é 3. Ou seja, desenhe um pequeno retângulo preenchido com largura 3.
//A altura e a coordenada vertical são determinadas pelos preços de abertura e fechamento.
// Após testes, constatou-se que esta função deve escrever as coordenadas do ponto superior esquerdo antes das coordenadas do ponto inferior direito.
// Em vez de julgar automaticamente qual dos dois pontos é o superior esquerdo ou o inferior direito.
ImageFilledRectangle($img,$x-1,$y5,$x+1.220,$linecolor);
//Desenhe o cilindro de volume com base no volume de negociação.
ImageLine($img,$x,$y3,$x,$y4,$linecolor);
// Desenha linhas de sombra superiores e inferiores com base no preço mais alto e no preço mais baixo.
}
// Tente desenhar um. A abertura foi de 8,50, a máxima foi de 8,88, a mínima foi de 8,32 e o fechamento foi de 8,80, com 6.578 lotes negociados.
kline($im,8,50,8,88,8,32,8,80,6578,1);
//Desenhe outro. A abertura foi 8,80, a máxima foi 9,50, a mínima foi 8,80 e o fechamento foi 9,50, com 8.070 lotes negociados.
// Que grande Yangxian com a cabeça descoberta e os pés descalços!
kline($im,8,80,9,50,8,80,9,50,8070,2);
// Outra linha negativa. A abertura foi 9,80, a máxima foi 9,80, a mínima foi 8,90 e o fechamento foi 9,06, com 10.070 lotes negociados.
// Pago! Como foi bom jogá-lo fora ontem.
kline($im,9.80,9.80,8.90,9.06,10070,3);
// ……
ImagePNG($im);
ImagemDestroy($im);
?>
Claro, seria muito problemático gravar dados como esses todos os dias. O que faço é buscar dados do banco de dados.
Isso é tudo por enquanto.