ホームページ  >  記事  >  バックエンド開発  >  GD ライブラリを使用して PHP で折れ線グラフを描画する 折れ線グラフを描画する方法

GD ライブラリを使用して PHP で折れ線グラフを描画する 折れ線グラフを描画する方法

PHP中文网
PHP中文网オリジナル
2016-07-12 09:05:191090ブラウズ

この記事では、PHP で折れ線グラフを描画するための GD ライブラリの使用法をコードを通して紹介します。これには、PHP での GD ライブラリの簡単な使用方法が含まれます。興味のある友人は、PHP で一緒に学ぶことができます。 image 関数を直接使用することもできますが、処理されるほとんどの画像は、PHP をコンパイルするときに GD ライブラリを必要とします。 GD ライブラリのインストールに加えて、サポートする必要がある画像形式に応じて、PHP で他のライブラリが必要になる場合があります。 GD ライブラリは、http://www.boutell.com/gd/ から無料でダウンロードできます。GD ライブラリの最新バージョンでは、GIF、JPEG、PNG、WBMP、XBM などの形式の画像がサポートされています。 . ファイルに加え、FreeType や Type 1 などのいくつかのフォント ライブラリもサポートしています。 GDライブラリの機能を利用することで、さまざまな点、線、幾何学図形、文字、色などの演算や加工を行うことができ、また、さまざまな形式の画像ファイルを作成したり読み込んだりすることもできます。

PHP では、GD ライブラリを介して画像を処理する操作は、まずメモリ上で処理され、操作が完了した後、ブラウザに出力されるか、ファイル ストリームの形式でサーバーのディスクに保存されます。イメージの作成は、以下に示す 4 つの基本的な手順で行う必要があります。

(1) キャンバスの作成: すべての描画デザインは背景画像上で完成する必要があり、キャンバスは実際には画像情報を保存するためにメモリ内で開かれる一時領域です。今後の画像操作はこの背景キャンバスに基づいて行われ、このキャンバスの管理はペイント時に使用するキャンバスと同様です。

(2) 画像の描画: キャンバスの作成後、このキャンバス リソースを使用して、画像の色を設定し、キャンバスを塗りつぶし、点、線分、さまざまな幾何学図形を描画し、画像にテキストを追加できます。多彩なポートレート機能も搭載。

(3) 出力画像: 画像全体の描画が完了したら、画像をサーバーが指定したファイルに特定の形式で保存するか、画像をブラウザーに直接出力して表示する必要があります。ユーザー。ただし、画像を出力する前に、header() 関数を使用して Content-type を送信し、ブラウザに通知する必要があります。今回はテキストではなく画像が送信されます。

(4) リソースの解放: 画像が出力されると、キャンバス内のコンテンツは使用できなくなります。システム リソースを節約するには、キャンバスが占有しているすべてのメモリ リソースを時間内にクリアする必要があります。

GD を使用して PHP で折れ線グラフを描画します。コードは次のとおりです:

Class Chart{
  private $image; // 定义图像
  private $title; // 定义标题
  private $ydata; // 定义Y轴数据
  private $xdata; // 定义X轴数据
  private $seriesName; // 定义每个系列数据的名称
  private $color; // 定义条形图颜色
  private $bgcolor; // 定义图片背景颜色
  private $width; // 定义图片的宽
  private $height; // 定义图片的长
  /*
  * 构造函数 
  * String title 图片标题
  * Array xdata 索引数组,X轴数据
  * Array ydata 索引数组,数字数组,Y轴数据
  * Array series_name 索引数组,数据系列名称
  */
  function __construct($title,$xdata,$ydata,$seriesName) {  
   $this->title = $title;
   $this->xdata = $xdata;
   $this->ydata = $ydata;
   $this->seriesName = $seriesName;
   $this->color = array('#DC', '#B', '#EDB', '#DDDF', '#CBE', '#E', '#FF', '#FFF', '#AFC');
  }
  /*
  * 公有方法,设置条形图的颜色 
  * Array color 颜色数组,元素取值为'#DC'这种形式
  */
  function setBarColor($color){
   $this->color = $color;
  }
 /*
  * 绘制折线图
  */
  public function paintLineChart() {
   $ydataNum = $this->arrayNum($this->ydata); // 取得数据分组的个数
   $max = $this->arrayMax($this->ydata); // 取得所有呈现数据的最大值
   $max = ($max > )? $max : ;
   $multi = $max/; // 如果最大数据是大于的则进行缩小处理  
   $barHeightMulti = .; // 条形高缩放的比例
   $lineWidth = ;
   $chartLeft = (+strlen($max))*; // 设置图片左边的margin
   $lineY = ; // 初始化条形图的Y的坐标
   // 设置图片的宽、高
   //$this->width = $lineWidth*count($this->xdata) + $chartLeft - $lineWidth/.; 
   $margin = ; // 小矩形描述右边margin
   $recWidth = ; // 小矩形的宽
   $recHeight = ; // 小矩形的高
   $space = ; // 小矩形与条形图的间距
   $tmpWidth = ;
   // 设置图片的宽、高
   $lineChartWidth = $lineWidth*count($this->xdata) + $chartLeft - $lineWidth/. ;
   // 两个系列数据以上的加上小矩形的宽
   if($ydataNum > ) {
    $tmpWidth = $this->arrayLengthMax($this->seriesName)**/ + $space + $recWidth + + $margin;
   } 
   $this->width = $lineChartWidth + $tmpWidth; 
   $this->height = ; 
   $this->image = imagecreatetruecolor($this->width ,$this->height); // 准备画布
   $this->bgcolor = imagecolorallocate($this->image,,,); // 图片的背景颜色
   // 设置条形图的颜色
   $color = array();
   foreach($this->color as $col) {
    $col = substr($col,,strlen($col)-);
    $red = hexdec(substr($col,,));
    $green = hexdec(substr($col,,));
    $blue = hexdec(substr($col,,));
    $color[] = imagecolorallocate($this->image ,$red, $green, $blue);
   }
   // 设置线段的颜色、字体的颜色、字体的路径
   $lineColor = imagecolorallocate($this->image ,xcc,xcc,xcc);
   $fontColor = imagecolorallocate($this->image, x,xf,xf);
   $fontPath = 'font/simsun.ttc';
   imagefill($this->image,,,$this->bgcolor); // 绘画背景
   // 绘画图的分短线与左右边线
   for($i = ; $i < ; $i++ ) {
    imageline($this->image,$chartLeft-,$lineY-$barHeightMulti*$max//$multi*$i,$lineChartWidth,$lineY-$barHeightMulti*$max//$multi*$i,$lineColor);
    imagestring($this->image,,,$lineY-$barHeightMulti*$max//$multi*$i-,floor($max/*$i),$fontColor);
   }  
   imageline($this->image,$chartLeft-,,$chartLeft-,$lineY,$lineColor);
   imageline($this->image,$lineChartWidth-,,$lineChartWidth-,$lineY,$lineColor);
   $style = array($lineColor,$lineColor,$lineColor,$lineColor,$lineColor,$this->bgcolor,$this->bgcolor,$this->bgcolor,$this->bgcolor,$this->bgcolor);
   imagesetstyle($this->image,$style);
   // 绘制折线图的分隔线(虚线)
   foreach($this->xdata as $key => $val) {
     $lineX = $chartLeft + + $lineWidth*$key;
     imageline($this->image,$lineX,,$lineX,$lineY,IMG_COLOR_STYLED);
   }
   // 绘画图的折线
   foreach($this->ydata as $key => $val) {
    if($ydataNum == ) {
     // 一个系列数据时
     if($key == count($this->ydata) - ) break;
     $lineX = $chartLeft + + $lineWidth*$key;
     $lineY = $lineY-$barHeightMulti*($this->ydata[$key+])/$multi;
     // 画折线
     if($key == count($this->ydata) - ) {
      imagefilledellipse($this->image,$lineX+$lineWidth,$lineY,,,$color[]);
     }
     imageline($this->image,$lineX,$lineY-$barHeightMulti*$val/$multi,$lineX+$lineWidth,$lineY,$color[]);
     imagefilledellipse($this->image,$lineX,$lineY-$barHeightMulti*$val/$multi,,,$color[]);
    }elseif($ydataNum > ) {
     // 多个系列的数据时
     foreach($val as $ckey => $cval) {
      if($ckey == count($val) - ) break; 
      $lineX = $chartLeft + + $lineWidth*$ckey;
      $lineY = $lineY-$barHeightMulti*($val[$ckey+])/$multi;
      // 画折线
      if($ckey == count($val) - ) {
       imagefilledellipse($this->image,$lineX+$lineWidth,$lineY,,,$color[$key%count($this->color)]);
      }
      imageline($this->image,$lineX,$lineY-$barHeightMulti*$cval/$multi,$lineX+$lineWidth,$lineY,$color[$key%count($this->color)]);
      imagefilledellipse($this->image,$lineX,$lineY-$barHeightMulti*$cval/$multi,,,$color[$key%count($this->color)]);
     }
    }
   }
   // 绘画条形图的x坐标的值
   foreach($this->xdata as $key => $val) {
    $lineX = $chartLeft + $lineWidth*$key + $lineWidth/ - ;
    imagettftext($this->image,,-,$lineX,$lineY+,$fontColor,$fontPath,$this->xdata[$key]);
   }  
   // 两个系列数据以上时绘制小矩形及之后文字说明
   if($ydataNum > ) {
    $x = $lineChartWidth + $space;
    $y = ;
    foreach($this->seriesName as $key => $val) {
     imagefilledrectangle($this->image,$x,$y,$x+$recWidth,$y+$recHeight,$color[$key%count($this->color)]);  
     imagettftext($this->image,,,$x+$recWidth+,$y+$recHeight-,$fontColor,$fontPath,$this->seriesName[$key]);
     $y += $recHeight + ;   
    }
   }
   // 绘画标题
   $titleStart = ($this->width - .*strlen($this->title))/;
   imagettftext($this->image,,,$titleStart,,$fontColor,$fontPath,$this->title);
   // 输出图片
   header("Content-Type:image/png");
   imagepng ( $this->image );
  }
  /*
  * 私有方法,当数组为二元数组时,统计数组的长度 
  * Array arr 要做统计的数组
  */
  private function arrayNum($arr) {
   $num = ;
   if(is_array($arr)) {
    $num++;
    for($i = ; $i < count($arr); $i++){
     if(is_array($arr[$i])) {
      $num = count($arr);
      break;
     }
    }
   }
   return $num;
  }
  /*
  * 私有方法,计算数组的深度 
  * Array arr 数组
  */
  private function arrayDepth($arr) {
   $num = ;
   if(is_array($arr)) {
    $num++;
    for($i = ; $i < count($arr); $i++){
     if(is_array($arr[$i])) {
      $num += $this->arrayDepth($arr[$i]);
      break;
     }
    }
   }
   return $num;
  }
  /*
  * 私有方法,找到一组中的最大值 
  * Array arr 数字数组
  */
  private function arrayMax($arr) {
   $depth = $this->arrayDepth($arr);
   $max = ;
   if($depth == ) {
    rsort($arr);
    $max = $arr[];  
   }elseif($depth > ) {
    foreach($arr as $val) {
     if(is_array($val)) {
      if($this->arrayMax($val) > $max) {
       $max = $this->arrayMax($val);
      }
     }else{     
      if($val > $max){
       $max = $val;
      }
     } 
    }   
   }
   return $max;
  }
  /*
  * 私有方法,求数组的平均值 
  * Array arr 数字数组
  */
  function arrayAver($arr) {
   $aver = array();
   foreach($arr as $val) {
    if(is_array($val)) {
     $aver = array_merge($aver,$val);
    }else{
     $aver[] = $val;
    }
   }
   return array_sum($aver)/count($aver);
  }
  /*
  * 私有方法,求数组中元素长度最大的值 
  * Array arr 字符串数组,必须是汉字
  */
  private function arrayLengthMax($arr) {
   $length = ;
   foreach($arr as $val) {
    $length = strlen($val) > $length ? strlen($val) : $length;
   }
   return $length/;
  } 
  // 析构函数
  function __destruct(){
   imagedestroy($this->image);
  }
 }

テストコードは次のとおりです:

 $xdata = array(&#39;测试一&#39;,&#39;测试二&#39;,&#39;测试三&#39;,&#39;测试四&#39;,&#39;测试五&#39;,&#39;测试六&#39;,&#39;测试七&#39;,&#39;测试八&#39;,&#39;测试九&#39;);
 $ydata = array(array(,,,,,,,,),array(,,,,,,,,));
 $color = array();
 $seriesName = array("七月","八月");
 $title = "测试数据";
 $Img = new Chart($title,$xdata,$ydata,$seriesName);
 $Img->paintLineChart();

効果の画像は次のとおりです:


これでコードは終わりです。

以下では、phpでのGDライブラリの簡単な使い方をいくつか紹介します

今日はGDライブラリの簡単な使い方をいくつか学びましたので、まとめてみましょう!

GDライブラリとは何ですか? 、グラフィック デバイス、イメージ ツール ライブラリ、gd ライブラリは、グラフィックを処理するための PHP の拡張ライブラリです。GD ライブラリを使用して、画像を処理したり、画像を生成したりできます。 Web サイトでは、通常、GD ライブラリは、サムネイルの生成や画像への透かしの追加、または Web サイト データに関するレポートの生成に使用されます。

php は HTML テキストの出力に限定されません。 GD 拡張ライブラリを使用すると、PHP を使用してテキスト ボタン、検証コード、データ チャートなどの画像を動的に出力することもできます。 Ha は、画像を簡単に編集したり、サムネイルを処理したり、画像に透かしを追加したりすることができ、強力な画像処理機能を備えています。

まず、GD ライブラリと、簡単なグラフィックを描画するためのいくつかの手順について説明します。

1. まず、キャンバスを作成します。ここでは、imagecreatetruecolor 関数を使用します。または、imagecreate を使用できるという違いがあります。後者は、パレットベースの画像を作成します

$img=imagecreatetruecolor(100,100)。これには、作成した画像の幅と高さに対応する 2 つのパラメータがあります

2. いくつかの必要な「染料ボックス」を設定します。 "

実際には、後で使用するいくつかの塗りつぶしの色を定義するためです。ここでは、この位置で均一に色を定義します。ここでは、imagecolorallocate 関数を使用します

$white=imagecolorallocate($img,0xFF,0xFF,0xFF)或者可以使用RGB的颜色命名方式 如$white=imagecolorallocate($img,255,255,255);

$gray = imagecolorallocate($img, 0xC0, 0xC0, 0xC0);
$darkgray = imagecolorallocate($img, 0x90, 0x90, 0x90);
$navy = imagecolorallocate($img, 0x00, 0x00, 0x80);
$darknavy = imagecolorallocate($img, 0x00, 0x00, 0x50);
$red = imagecolorallocate($img, 0xFF, 0x00, 0x00);
$darkred = imagecolorallocate($img, 0x90, 0x00, 0x00);
$black=imagecolorallocate($img,0x00,0x00,0x00);

ここでは、さらに必要な色を定義します

3塗りつぶされた領域の色は、imagefill 関数

imagefill($img,0,0,$white) を使用すると、単純に背景色を塗りつぶすことを意味します。座標 x y

4 、円グラフなどのグラフィックを描画するには、imagefilledarc 関数が必要です

imagefilledarc() には、imagefilledarc($img,50,$i,100,50,0 など) のような比較的多くのパラメーターがあります。 ,45,$ red,IMG_ARC_PIE);

これは、それぞれ、赤色のワード img 画像上に 50、$i から始まり、角度 0 ~ 45 の範囲内で円弧を描くことを意味します

5。説明の質問を追加することもできます。たとえば、文字列を水平方向に追加するには、imagestring($img,1,20,40,"hello,world!",$red) を使用します。これは、img に赤い hello,world を書き込むことを意味します。座標として 20 40 を使用した画像。 Words

6. 画像出力

に関しては、まずブラウザに出力したい画像形式を伝える必要があります。たとえば、png を出力したい場合は、header("Content-type:image/png") を使用します。 );

次に、画像をブラウザに出力します、imagepng($img);

最後に、画像を破棄します、つまり、画像ストレージが占有しているメモリを解放します imagedestroy(img);,

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。