說說PHP作圖(三)

上次說到用GD作各種幾何圖形,以及填充顏色。其中故意把這樣一個較復雜的情況
留到後面,這就是任意多邊形和任意多邊形的填充顏色。


<?
  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);


  $parray = array(40,10,60,10,70,20,60,50,40,50,30,20);
  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,用法不變。
  // 是輸出豎排的文字。


  ImagePNG($im);
  ImageDestroy($im); 
?>


    在使用輸出字符的函數同時,如果能知道不同字型的字在圖象裡要占用的寬度、高度,
對於安排輸出字符的位置將是多麼方便的啊!PHP提供給我們瞭:ImageFontWidth()和
ImageFontHeight(),其參數很簡單,隻有一個:即字型的編號。例如ImageFontWidth(5)
就是取得5號字每個字符的寬度,ImageFontHeight(3)就是取得3號字每個字符的高度。這麼
簡單,就不舉例瞭,等一下在後面的代碼中還有用到。


    跟輸出字符串類似,ImageChar和ImageCharUp輸出單個字符,用途比較少,甚至可以
不用——無論字符還是字符串,都用ImageString和ImageStringUp就可以瞭嘛!


    下面,我就利用我做過的繪制股票K線分析圖的其中一部分代碼,把前面講到的內容系統
地應用一下。因為其中涉及數據庫,不能把原始代碼拿過來給大傢拿回去測試。隻能構造一些
數據,模擬從數據庫裡取得的股市行情。鑒於這裡懂股票K線的人可能不多,大傢可能不知道K線
圖應該怎麼畫法。然而,我也不能在這裡講K線具體是怎麼回事,隻是介紹這樣一系列方法。等畫
好以後,你肯定可以看出,以前確實見過這樣的圖。


<?php
Header(“Content-type: 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);
     // 寫出這個字符串。
  }


$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線柱寫成函數
function kline($img,$kp,$zg,$zd,$sp,$cjl,$ii)
// 參數:$img 圖象;$kp $zg $zd $sp 是開盤、最高、最低、收盤;
// $cjl 成交量;$ii 計數器,表示K線柱的序號。
{
  global $bl,$zzd,$lzg;
  // 聲明該函數裡用到的$bl,$zzd,$lzg三個變量是全局變量。
  $h=150;  // K線柱區域高度是 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<=$y2)  ImageFilledRectangle($img,$x-1,$y1,$x+1,$y2,$linecolor);
  else  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);
  // 根據最高價、最低價繪上下影線。<B

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *