La dernière fois, j'ai parlé de l'utilisation de GD pour créer diverses formes géométriques et couleurs de remplissage. L'une des situations les plus compliquées est délibérément laissée pour plus tard, à savoir la couleur de remplissage des polygones arbitraires et des polygones arbitraires.
<?
Header("Type de contenu : image/png");
$im = ImageCréer (200, 100) ;
$col_blk = ImageColorAllocate($im, 0,0,0);
$col_grn = ImageColorAllocate($im, 0,255,0);
$parray = tableau(40,10,60,10,70,20,60,50,40,50,30,20);
//Définissez un tableau dont les 12 membres sont les coordonnées horizontales et verticales de 6 points.
ImagePolygon($im,$parray,6,$col_grn);
// C'est la fonction pour dessiner des polygones arbitraires. $parray est le tableau qui vient d'être défini.
// 6 signifie six points. Notez que les six points connectés forment un hexagone.
// Il n'est pas nécessaire d'ajouter artificiellement à la fin un point identique au premier point pour fermer la forme.
ImagePNG($im);
ImageDestroy($im);
?>
Vous auriez dû penser à la fonction de remplissage de couleur de n'importe quel polygone :
<?
Header("Type de contenu : image/png");
$im = ImageCréer (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 = tableau(40,10,60,10,70,20,60,50,40,50,30,20);
ImageFilledPolygon($im,$parray,6,$col_grn);
ImagePNG($im);
ImageDestroy($im);
?>
Hum. Nous pouvons maintenant écrire sur l'image. Mais ne vous enthousiasmez pas trop pour l’instant, l’écriture des caractères chinois demandera quelques difficultés.
Ceci sera expliqué progressivement plus tard. Voyons comment écrire simplement des caractères occidentaux.
<?
Header("Type de contenu : image/png");
$im = ImageCréer (200, 250) ;
$col_blk = ImageColorAllocate($im, 0,0,0);
$col_orn = ImageColorAllocate($im, 255 192,0);
$str="Ceci est un test.";
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);
// Ici, ImageString est appelé cinq fois de suite, à des emplacements différents.
//La chaîne $str est affichée dans des tailles de police allant de petite à grande.
// La fonction ImageString ne prend en charge que cinq polices (1~5)
ImagePNG($im);
ImageDestroy($im);
?>
Regardez encore :
<?
//En-tête("Type de contenu : image/png");
$im = ImageCréer (200, 250) ;
$col_blk = ImageColorAllocate($im, 0,0,0);
$col_orn = ImageColorAllocate($im, 255 192,0);
$str="Ceci est un test.";
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);
//Le nom de la fonction est remplacé par ImageStringUp et l'utilisation reste inchangée.
// consiste à afficher du texte vertical.
ImagePNG($im);
ImageDestroy($im);
?>
Lorsque vous utilisez la fonction qui génère des caractères, si vous pouvez connaître la largeur et la hauteur qu'occupent les caractères de différents types de polices dans l'image,
Comme il serait pratique d'organiser la position des caractères de sortie ! PHP nous fournit : ImageFontWidth() et
ImageFontHeight(), son paramètre est très simple, il n'y en a qu'un : le numéro de la police. Par exemple ImageFontWidth(5)
Il s'agit d'obtenir la largeur de chaque caractère de police de taille 5, et ImageFontHeight(3) doit obtenir la hauteur de chaque caractère de police de taille 3. C'est si simple que je ne donnerai pas d'exemple. Il sera utilisé plus tard dans le code suivant.
Semblables à la sortie de chaînes, ImageChar et ImageCharUp génèrent un seul caractère. Ils ont moins d'utilisations et peuvent même ne pas être utilisés - quels que soient les caractères ou les chaînes, utilisez simplement ImageString et ImageStringUp !
Ensuite, j'utiliserai une partie du code que j'ai utilisé pour dessiner des graphiques d'analyse boursier K-line afin d'appliquer systématiquement le contenu mentionné ci-dessus. Parce qu'il s'agit d'une base de données, nous ne pouvons pas transférer le code original pour que tout le monde puisse le reprendre pour le tester. Nous ne pouvons construire que quelques données pour simuler les conditions boursières obtenues à partir de la base de données. Comme il n'y a peut-être pas beaucoup de gens ici qui comprennent la ligne K des actions, vous ne savez peut-être pas comment dessiner le graphique de la ligne K. Cependant, je ne peux pas parler ici des spécificités de la K-line, je ne peux que présenter une série de méthodes. Après avoir terminé le dessin, vous saurez certainement que vous avez déjà vu des images comme celle-ci.
<?php
Header("Type de contenu : image/png");
$im = ImageCreate(640,260);
$bkground = ImageColorAllocate($im,255,255,255);
$données = 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);
// Définissez d'abord les couleurs utilisées pour dessiner divers objets.
pour($i=20;$i<=220;$i+=25)
ImageLine($im, 60, $i, 560, $i, $gird);
pour($j=60;$j<=560;$j+=25)
ImageLine($im, $j, 20, $j, 220, $gird);
// Calculez la position et la largeur de la grille à l'avance et utilisez une boucle for pour tracer la ligne, ce qui évite bien des problèmes.
$zzg=10,55 ;
$zzd=7,63 ;
$lzg=10350 ;
// Données boursières hypothétiques,
// $zzg est le prix le plus élevé au cours de la période à analyser, en supposant qu'il soit de 10,55 yuans.
//$zzd est le prix le plus bas au cours de la période à analyser, en supposant qu'il soit de 7,63 yuans.
// $lzg est le volume de transactions le plus élevé au cours de la période qui doit être analysé, en supposant qu'il s'agit de 10 350 lots.
// Il s'agit d'une donnée importante pour calculer le "tick" de la grille de coordonnées.
$bl=$zzg-$zzd;
// La différence entre le prix le plus élevé et le prix le plus bas. Selon son rapport à la hauteur totale de la grille,
// Vous pouvez obtenir une position réelle du prix dans la grille.
pour($i=1;$i<=7;$i++)
{
$y=$i*25-10 ;
// Calcule la hauteur appropriée (ordonnée) de l'échelle de l'étiquette en fonction de la position des lignes de la grille.
$str=Number_Format($zzg-($i-1)/6*$bl,2,".",",");
// Calculez le prix correspondant à chaque graduation et formatez la chaîne.
$x=55-ImageFontWidth(2)*StrLen($str);
// Calculez l'abscisse appropriée en fonction de la largeur qu'occupera cette chaîne.
ImageString($im, 2,$x, $y,$str, $data);
//Écrivez cette chaîne.
}
$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);
// Comme il n'existe que deux échelles pour écrire le volume des transactions, il n'est pas rentable d'écrire en boucle.
// Si le nombre est relativement grand, une boucle doit également être utilisée.
// Puisqu'un graphique K-line nécessite de dessiner d'innombrables petites barres K-line, dessinez une petite barre K-line en fonction
fonction kline($img,$kp,$zg,$zd,$sp,$cjl,$ii)
// Paramètres : $img image ; $kp $zg $zd $sp est le cours d'ouverture, le plus haut, le plus bas et le cours de clôture ;
// Volume de trading $cjl ; compteur $ii, indiquant le numéro de série de la barre K-line.
{
global $bl,$zzd,$lzg;
// Déclarez les trois variables $bl, $zzd et $lzg utilisées dans cette fonction comme variables globales.
$h=150; //La hauteur de la zone de la colonne K-line est de 150.
$hh=200; //La hauteur totale de la zone de la colonne K-line et de la zone de la colonne de volume est de 200.
si($sp<$kp)
$linecolor = ImageColorAllocate($img,0,175,175);
// Si le cours de clôture est inférieur au cours d'ouverture, c'est une ligne négative, de couleur cyan
autre
$linecolor = ImageColorAllocate($img,255,0,0);
// Sinon, c'est une ligne positive, utilisez du rouge.
$x=58+$ii*4 ;
// Calculez l'abscisse en fonction du numéro de barre de la ligne K.
$y1=20+$h-($kp-$zzd)/$bl*$h ;
// Calculez la coordonnée verticale correspondante en fonction du prix d'ouverture.
$y2=20+$h-($sp-$zzd)/$bl*$h ;
// Calculez la coordonnée verticale correspondante en fonction du cours de clôture.
$y3=20+$h-($zg-$zzd)/$bl*$h ;
// Calculez la coordonnée verticale correspondante en fonction du prix le plus élevé.
$y4=20+$h-($zd-$zzd)/$bl*$h ;
// Calculez la coordonnée verticale correspondante en fonction du prix le plus bas.
$y5=20+$hh-$cjl/$lzg*($hh-$h);
// Calculez la coordonnée verticale correspondante en fonction du volume des échanges.
if($y1<=$y2) ImageFilledRectangle($img,$x-1,$y1,$x+1,$y2,$linecolor);
else ImageFilledRectangle($img,$x-1,$y2,$x+1,$y1,$linecolor);
// L'abscisse est de moins 1 à plus 1 et l'étendue est de 3. Autrement dit, dessinez un petit rectangle rempli d'une largeur de 3.
//La hauteur et la coordonnée verticale sont déterminées par les cours d'ouverture et de clôture.
// Après tests, il a été constaté que cette fonction doit écrire les coordonnées du point supérieur gauche avant les coordonnées du point inférieur droit.
// Au lieu de juger automatiquement lequel des deux points est en haut à gauche ou en bas à droite.
ImageFilledRectangle($img,$x-1,$y5,$x+1,220,$linecolor);
//Dessinez le cylindre de volume en fonction du volume des échanges.
ImageLine($img,$x,$y3,$x,$y4,$linecolor);
// Dessinez des lignes d'ombre supérieure et inférieure en fonction du prix le plus élevé et du prix le plus bas.
}
// Essayez d'en dessiner un. L'ouverture était à 8,50, le plus haut à 8,88, le plus bas à 8,32 et la clôture à 8,80, avec 6 578 lots négociés.
kline($im,8.50,8.88,8.32,8.80,6578,1);
//Dessinez-en un autre. L'ouverture était à 8,80, le plus haut à 9,50, le plus bas à 8,80 et la clôture à 9,50, avec 8 070 lots négociés.
// Quel grand Yangxian avec la tête nue et les pieds nus !
kline($im,8.80,9.50,8.80,9.50,8070,2);
// Une autre ligne négative. L'ouverture était à 9,80, le plus haut à 9,80, le plus bas à 8,90 et la clôture à 9,06, avec 10 070 lots négociés.
// Payé! Comme c'était agréable de le jeter hier.
kline($im,9.80,9.80,8.90,9.06,10070,3);
// ……
ImagePNG($im);
ImageDestroy($im);
?>
Bien sûr, il serait trop compliqué d’écrire de telles données quotidiennement. Ce que je fais, c'est récupérer les données de la base de données.
C'est tout pour cette fois.