首頁 php教程 php手册 说说PHP作图(三)

说说PHP作图(三)

Jun 13, 2016 am 10:34 AM
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线具体是怎么回事,只是介绍这样一系列方法。等画
好以后,你肯定可以看出,以前确实见过这样的图。

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  ImageLine($im, 60, $i, 560, $i, $gird);
for($j=60;$j  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  {
     $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    $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);
  // 横坐标减1到加1,跨度为3。即绘宽度为3的小填充矩形。
  // 高度和纵坐标则是由开盘、收盘价决定的。
  // 经测试发现,这个函数必须是左上点坐标写在右下点坐标之前,
  // 而非自动判断两点孰为左上,孰为右下。
 
  ImageFilledRectangle($img,$x-1,$y5,$x+1,220,$linecolor);
  // 根据成交量绘成交量柱体。
  ImageLine($img,$x,$y3,$x,$y4,$linecolor);
  // 根据最高价、最低价绘上下影线。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南

CakePHP 專案配置 CakePHP 專案配置 Sep 10, 2024 pm 05:25 PM

CakePHP 專案配置

CakePHP 日期和時間 CakePHP 日期和時間 Sep 10, 2024 pm 05:27 PM

CakePHP 日期和時間

CakePHP 檔案上傳 CakePHP 檔案上傳 Sep 10, 2024 pm 05:27 PM

CakePHP 檔案上傳

CakePHP 路由 CakePHP 路由 Sep 10, 2024 pm 05:25 PM

CakePHP 路由

討論 CakePHP 討論 CakePHP Sep 10, 2024 pm 05:28 PM

討論 CakePHP

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發

CakePHP 快速指南 CakePHP 快速指南 Sep 10, 2024 pm 05:27 PM

CakePHP 快速指南

See all articles