ホームページ >バックエンド開発 >PHPチュートリアル >PHP描画の話(3)_PHPチュートリアル
上次说到用GD作各种几何图形,以及填充颜色。其中故意把这样一个较复杂的情况 你应该已经想到了,任意多边形填充颜色的函数: $parray = array(40,10,60,10,70,20,60,50,40,50,30,20); 嗯。下面我们可以在图象上写字了。不过,先别高兴,要想写汉字还得费一些麻烦。 再看: ImagePNG($im); 在使用输出字符的函数同时,如果能知道不同字型的字在图象里要占用的宽度、高度, 跟输出字符串类似,ImageChar和ImageCharUp输出单个字符,用途比较少,甚至可以 下面,我就利用我做过的绘制股票K线分析图的其中一部分代码,把前面讲到的内容系统 Header("Content-type: image/png"); $im = ImageCreate(640,260); for($i=20;$iImageLine($im, 60, $i, 560, $i, $gird); $zzg=10.55; $ y = $ i*25-10; ImageString($im,2,564,189,$str,$data); // パラメーター: $img image; $kp $zg $zd $sp は始値、最高値、最低値、終値です。 // 高さと垂直座標は始値と終値によって決まります。
留到后面,这就是任意多边形和任意多边形的填充颜色。
Header("Content-type: image/png");
$im = ImageCreate (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);
// 定义一个数组,12个成员是6个点的横纵坐标。
ImagePolygon($im,$parray,6,$col_grn);
// 这就是绘制任意多边形的函数,$parray是刚才定义的数组,
// 6表示六个点。注意六个点连成的是六边形。
// 不必人为地为了闭合图形而在最后增加一个与第一点相同的点。
ImagePNG($im);
ImageDestroy($im);
?>
Header("Content-type: 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);
ImageFilledPolygon($im,$parray,6,$col_grn);
ImagePNG($im);
ImageDestroy($im);
?>
这个以后再逐渐解释。先看看怎么简单地写西文字符吧。
Header("Content-type: image/png");
$im = ImageCreate (200, 250);
$col_blk = ImageColorAllocate($im, 0,0,0);
$col_orn = ImageColorAllocate($im, 255,192,0);
$str="This is a 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);
// 这里连续五次调用ImageString,在不同位置,
// 分别用从小到大的字型输出了字符串 $str。
// ImageString 函数只支持五种字型(1~5)
ImagePNG($im);
ImageDestroy($im);
?>
//Header("Content-type: image/png");
$im = ImageCreate (200, 250);
$col_blk = ImageColorAllocate($im, 0,0,0);
$col_orn = ImageColorAllocate($im, 255,192,0);
$str="This is a 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);
// 函数名换成了 ImageStringUp,用法不变。
// 是输出竖排的文字。
ImageDestroy($im);
?>
对于安排输出字符的位置将是多么方便的啊!PHP提供给我们了:ImageFontWidth()和
ImageFontHeight(),其参数很简单,只有一个:即字型的编号。例如ImageFontWidth(5)
就是取得5号字每个字符的宽度,ImageFontHeight(3)就是取得3号字每个字符的高度。这么
简单,就不举例了,等一下在后面的代码中还有用到。
不用——无论字符还是字符串,都用ImageString和ImageStringUp就可以了嘛!
地应用一下。因为其中涉及数据库,不能把原始代码拿过来给大家拿回去测试。只能构造一些
数据,模拟从数据库里取得的股市行情。鉴于这里懂股票K线的人可能不多,大家可能不知道K线
图应该怎么画法。然而,我也不能在这里讲K线具体是怎么回事,只是介绍这样一系列方法。等画
好以后,你肯定可以看出,以前确实见过这样的图。
$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($j=60;$j< =560;$j+=25)
ImageLine($im, $j, 20, $j, 220, $gird);
// 事前に位置とグリッド幅を計算し、for ループで線を描画します。多くの手間が省けます。
$zzd=7.63;
$lzg=10350;
// 仮想の株式市場データ、
// $zzg は分析対象期間中の最高値であり、10.55 元と仮定します。
// $zzd は分析が必要な期間中の最低価格で、7.63 元と仮定します。
// $lzg は、分析が必要な期間中の最高取引量であり、10350 ロットであると仮定します。
// これは座標グリッドの「スケール」を計算するための重要なデータです。
$bl=$zzg-$zzd;
// 最高価格と最低価格の差。それとグリッドの合計の高さの比率に従って、
// はグリッド内の実際の価格の位置を取得できます。
// 適切な高さ (垂直座標) は、グリッド線。
$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);
// ボリュームを書き込むためのスケールが 2 つしかないため、ループで書き込むのはコスト効率が良くありません。
// 数が比較的大きい場合は、ループも使用する必要があります。
// K 線グラフでは無数の小さな K 線バーを描画する必要があるため、小さな K 線バーの描画は関数として記述されます
// $cjl カウンター、K を表します。 -行列のシリアル番号。
{
global $bl,$zzd,$lzg;
// この関数で使用する 3 つの変数 $bl, $zzd, $lzg をグローバル変数として宣言します。
$h=150; // K-line 列領域の高さは 150 です。
$hh=200; //K ライン列領域とボリューム列領域の高さの合計は 200 です。
if($sp<$kp)
$linecolor = ImageColorAllocate($img,0,175,175);
// 終値が始値より低い場合は陰線、シアンを使用します
else
$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 else ImageFilledRectangle($img,$x-1,$y2, $x+1,$y1,$linecolor);
// テストの結果、この関数は右下の点の座標よりも前に左上の点の座標を書き込む必要があることが判明しました。
// 2 つの点のどちらが左上か右下かを自動的に判断するのではなく、 。
ImageFilledRectangle($img,$x-1,$y5,$x+1,220,$linecolor);
// 取引量に基づいて出来高シリンダーを描画します。
ImageLine($img,$x,$y3,$x,$y4,$linecolor);
// 高値と安値を基準に上下の影線を描画します。