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

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

Jul 12, 2016 am 09:05 AM

この記事では、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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

セッションのハイジャックはどのように機能し、どのようにPHPでそれを軽減できますか? セッションのハイジャックはどのように機能し、どのようにPHPでそれを軽減できますか? Apr 06, 2025 am 12:02 AM

セッションハイジャックは、次の手順で達成できます。1。セッションIDを取得します。2。セッションIDを使用します。3。セッションをアクティブに保ちます。 PHPでのセッションハイジャックを防ぐための方法には次のものが含まれます。1。セッション_regenerate_id()関数を使用して、セッションIDを再生します。2。データベースを介してストアセッションデータを3。

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

確固たる原則と、それらがPHP開発にどのように適用されるかを説明してください。 確固たる原則と、それらがPHP開発にどのように適用されるかを説明してください。 Apr 03, 2025 am 12:04 AM

PHP開発における固体原理の適用には、次のものが含まれます。1。単一責任原則(SRP):各クラスは1つの機能のみを担当します。 2。オープンおよびクローズ原理(OCP):変更は、変更ではなく拡張によって達成されます。 3。Lischの代替原則(LSP):サブクラスは、プログラムの精度に影響を与えることなく、基本クラスを置き換えることができます。 4。インターフェイス分離原理(ISP):依存関係や未使用の方法を避けるために、細粒インターフェイスを使用します。 5。依存関係の反転原理(DIP):高レベルのモジュールと低レベルのモジュールは抽象化に依存し、依存関係噴射を通じて実装されます。

システムの再起動後にUnixSocketの権限を自動的に設定する方法は? システムの再起動後にUnixSocketの権限を自動的に設定する方法は? Mar 31, 2025 pm 11:54 PM

システムが再起動した後、UnixSocketの権限を自動的に設定する方法。システムが再起動するたびに、UnixSocketの許可を変更するために次のコマンドを実行する必要があります:sudo ...

phpstormでCLIモードをデバッグする方法は? phpstormでCLIモードをデバッグする方法は? Apr 01, 2025 pm 02:57 PM

phpstormでCLIモードをデバッグする方法は? PHPStormで開発するときは、PHPをコマンドラインインターフェイス(CLI)モードでデバッグする必要がある場合があります。

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? Apr 01, 2025 pm 03:12 PM

PHP開発でPHPのCurlライブラリを使用してJSONデータを送信すると、外部APIと対話する必要があることがよくあります。一般的な方法の1つは、Curlライブラリを使用して投稿を送信することです。

See all articles