前回は、GD を使用してさまざまな幾何学的形状と塗りつぶしの色を作成することについて説明しました。より複雑な状況の 1 つは、任意のポリゴンと任意のポリゴンの塗りつぶしの色です。
<?
Header("コンテンツタイプ: image/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 は 6 点を意味します。 6 つの点を接続すると六角形が形成されることに注意してください。
// 形状を閉じるために、最初の点と同じ点を最後に人為的に追加する必要はありません。
画像PNG($im);
ImageDestroy($im);
?>
任意の多角形の色を塗りつぶす関数を考えるべきでした。
<?
Header("コンテンツタイプ: image/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 = array(40,10,60,10,70,20,60,50,40,50,30,20);
ImageFilledPolygon($im,$parray,6,$col_grn);
画像PNG($im);
ImageDestroy($im);
?>
うーん。これで画像に書き込みができるようになりました。ただし、まだ興奮しすぎないでください。漢字を書くのは少し時間がかかります。
これについては後ほど徐々に説明していきます。欧文の簡単な書き方を見てみましょう。
<?
Header("コンテンツタイプ: image/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 が異なる場所で 5 回連続して呼び出されます。
//文字列$strをフォントサイズ小から大まで出力します。
// ImageString 関数は 5 つのフォント (1 ~ 5) のみをサポートします
画像PNG($im);
ImageDestroy($im);
?>
もう一度見てください:
<?
//Header("コンテンツタイプ: image/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 のフォントの各文字の幅を取得するのが、サイズ 3 のフォントの各文字の高さを取得するのが ImageFontHeight(3) です。非常に簡単なので、例は示しません。後続のコードで使用します。
文字列の出力と同様に、ImageChar と ImageCharUp は 1 つの文字を出力します。これらは用途が少なく、使用されない場合もあります。文字や文字列に関係なく、ImageString と ImageStringUp を使用してください。
次に、株価 K ライン分析チャートを描画するために使用したコードの一部を使用して、上記の内容を体系的に適用します。これにはデータベースが関係するため、オリジナルのコードを持ち込んで全員がテストできるようにすることはできません。データベースから取得した株式市場の状況をシミュレートするために、いくつかのデータを構築することしかできません。ここでは株価のKラインを理解している人は少ないかもしれないので、Kラインチャートの描き方が分からないかもしれません。ただし、ここでは K-line の詳細についてはお話しできません。一連の方法を紹介することしかできません。描き終わった後は、「こんな絵見たことある!」と必ず言えるはずです。
<?php
Header("コンテンツの種類: image/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ループで線を引くと手間が省けます。
$zzg=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);
//この文字列を書きます。
=
Number_Format($lzg,0,".",",");
ImageString($im,2,564,164,$str,$data);
$str=Number_Format($lzg/2,0,".",",");
ImageString($im,2,564,189,$str,$data);
// 取引量を書き込むためのスケールが 2 つしかないため、ループで書き込むのは費用対効果が高くありません。
// 数値が比較的大きい場合は、ループも使用する必要があります。
// K 折れ線グラフでは無数の小さな K 線バーを描画する必要があるため、関数として小さな K 線バーを描画します
関数 kline($img,$kp,$zg,$zd,$sp,$cjl,$ii)
// パラメータ: $img image; $kp $zg $zd $sp は始値、最高値、最低値、終値です。
// $cjl 取引量; $ii カウンター、K ライン バーのシリアル番号を示します。
{
グローバル $bl、$zzd、$lzg;
// この関数で使用する 3 つの変数 $bl、$zzd、$lzg をグローバル変数として宣言します。
$h=150; //K ライン列領域の高さは 150 です。
$hh=200; //K ライン列領域とボリューム列領域の高さの合計は 200 です。
if($sp<$kp)
$linecolor = ImageColorAllocate($img,0,175,175);
// 終値が始値より低い場合、シアン色の陰線になります。
それ以外
$linecolor = ImageColorAllocate($img,255,0,0);
// それ以外の場合は正の線なので、赤を使用します。
$x=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);
else ImageFilledRectangle($img,$x-1,$y2,$x+1,$y1,$linecolor);
//横軸はマイナス1からプラス1、スパンは3です。つまり、幅 3 の小さな塗りつぶされた長方形を描画します。
//高さと垂直座標は始値と終値によって決まります。
// テストの結果、この関数は左上の点の座標を右下の点の座標より前に書き込む必要があることがわかりました。
// 2 つの点のどちらが左上か右下かを自動的に判断するのではなく。
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 ロットが取引されました。
kline($im,8.50,8.88,8.32,8.80,6578,1);
//もう一枚描きます。始値は 8.80、最高値は 9.50、最低値は 8.80、終値は 9.50 で、8,070 ロットが取引されました。
// 裸頭裸足のヤンシアンはなんと素晴らしいことでしょう!
kline($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);
?>
もちろん、このようなデータを毎日書き込むのは面倒です。私がやっているのはデータベースからデータを取得することです。
今回はここまでです。