ホームページ バックエンド開発 PHPチュートリアル PHP 50 でグラフィックを作成するための完全な実践的方法 ページ 1/3

PHP 50 でグラフィックを作成するための完全な実践的方法 ページ 1/3

Jul 29, 2016 am 08:37 AM
function gt height public this

本文将展示如何使用 PHP 构建面向对象的图形层。使用面向对象的系统可以用来构建复杂的图形,这比使用标准 PHP 库中所提供的基本功能来构建图形简单很多。
  我将图形编辑程序分为两类:一类是绘图程序,利用这种程序可以一个像素一个像素地绘制图像;另外一类是制图程序,这种程序提供了一组对象,例如线、椭圆和矩形,您可以使用这些对象来组合成一幅大图像,例如 JPEG。绘图程序非常适合进行像素级的控制。但是对于业务图形来说,制图程序是比较好的方式,因为大部分图形都是由矩形、线和椭圆组成的。
  PHP 内置的制图基本操作与绘图程序非常类似。它们对于绘制图像来说功能非常强大;但是如果您希望自己的图像是一组对象集合时,这就不太适合了。本文将向您展示如何在 PHP 图形库的基础上构建一个面向对象的图形库。您将使用 PHP V5 中提供的面向对象的扩展。
  具有面向对象的图形支持之后,您的图形代码就非常容易理解和维护了。您可能还需要从一种单一的图形源将图形合成为多种类型的媒介:Flash 电影、SVG 等等。
目标
  创建一个图形对象库包括 3 个主要的目标:
从基本操作切换到对象上
  它不使用 imageline、imagefilledrectangle 以及其他图形函数,这个库应该提供一些对象,例如 Line、Rectangle 和 Oval,它们可以用来制作图像。它应该还可以支持构建更大的复杂对象或对对象进行分组的功能。
  可以进行 z 值排序
  制图程序让画家可以在画面表面上上下移动图形对象。这个库应该可以支持将一个对象放到其他对象前后的功能:它使用了一个 z 值,用来定义对象从制图平面开始的高度。z 值越大的对象被画得越晚,也就出现在那些 z 值较小的对象之上。
  提供 viewport 的转换
  通常,数据的坐标空间与图像的坐标空间是不同的。PHP 中的图形基本操作是对图像的坐标平面进行操作的。这个图形库应该支持 viewport 的规范,这样您就可以在一个程序员熟悉的坐标系统中指定图形了,并且可以自动进行伸缩来适应任何图像的大小。
  由于这里有很多特性,您将一步步地编写代码来展示这些代码如何不断增加功能。
基础知识
  让我们首先来看一个图形环境对象和一个名为 GraphicsObject 的接口,它是使用一个 Line 类实现的,功能就是用来画线。UML 如图 1 所示。
图 1. 图形环境和图形对象接口
 PHP 50创建图形的实用方法完整篇第1/3页
  GraphicsEnvironment 类中保存了图形对象和一组颜色,还包括宽度和高度。saveAsPng 方法负责将当前的图像输出到指定的文件中。
  GraphicsObject 是任何图形对象都必须使用的接口。要开始使用这个接口,您所需要做的就是使用 render 方法来画这个对象。它是由一个 Line 类实现的,它利用 4 个坐标:开始和结束的 x 值,开始和结束的 y 值。它还有一个颜色。当调用 render 时,这个对象从 sx,sy 到 ex,ey 画一条由名字指定的颜色的线。
  这个库的代码如清单 1 所示。
  清单 1. 基本的图形库

<?php 
class GraphicsEnvironment 
{ 
 public $width; 
 public $height; 
 public $gdo; 
 public $colors = array(); 
 public function __construct( $width, $height ) 
 { 
 $this->width = $width; 
 $this->height = $height; 
 $this->gdo = imagecreatetruecolor( $width, $height ); 
 $this->addColor( "white", 255, 255, 255 ); 
 imagefilledrectangle( $this->gdo, 0, 0, 
  $width, $height, 
  $this->getColor( "white" ) ); 
 } 
 public function width() { return $this->width; } 
 public function height() { return $this->height; } 
 public function addColor( $name, $r, $g, $b ) 
 { 
 $this->colors[ $name ] = imagecolorallocate( 
  $this->gdo, 
  $r, $g, $b ); 
 } 
 public function getGraphicObject() 
 { 
 return $this->gdo; 
 } 
 public function getColor( $name ) 
 { 
 return $this->colors[ $name ]; 
 } 
 public function saveAsPng( $filename ) 
 { 
 imagepng( $this->gdo, $filename ); 
 } 
} 
abstract class GraphicsObject 
{ 
 abstract public function render( $ge ); 
} 
class Line extends GraphicsObject 
{ 
 private $color; 
 private $sx; 
 private $sy; 
 private $ex; 
 private $ey; 
 public function __construct( $color, $sx, $sy, $ex, $ey ) 
 { 
 $this->color = $color; 
 $this->sx = $sx; 
 $this->sy = $sy; 
 $this->ex = $ex; 
 $this->ey = $ey; 
 } 
 public function render( $ge ) 
 { 
 imageline( $ge->getGraphicObject(), 
  $this->sx, $this->sy, 
  $this->ex, $this->ey, 
  $ge->getColor( $this->color ) ); 
 } 
} 
?> 
ログイン後にコピー

  测试代码如清单 2 所示:
  清单 2. 基本图形库的测试代码
<?php 
require_once( "glib.php" ); 
$ge = new GraphicsEnvironment( 400, 400 ); 
$ge->addColor( "black", 0, 0, 0 ); 
$ge->addColor( "red", 255, 0, 0 ); 
$ge->addColor( "green", 0, 255, 0 ); 
$ge->addColor( "blue", 0, 0, 255 ); 
$gobjs = array(); 
$gobjs []= new Line( "black", 10, 5, 100, 200 ); 
$gobjs []= new Line( "blue", 200, 150, 390, 380 ); 
$gobjs []= new Line( "red", 60, 40, 10, 300 ); 
$gobjs []= new Line( "green", 5, 390, 390, 10 ); 
foreach( $gobjs as $gobj ) { $gobj->render( $ge ); } 
$ge->saveAsPng( "test.png" ); 
?> 
ログイン後にコピー

  这个测试程序创建了一个图形环境。然后创建几条线,它们指向不同的方向,具有不同的颜色。然后,render 方法可以将它们画到图形平面上。最后,这段代码将这个图像保存为 test.png。
  在本文中,都是使用下面的命令行解释程序来运行这段代码,如下所示:
% php test.php 
% 
ログイン後にコピー


  图 2 显示了所生成的 test.png 文件在 Firefox 中的样子。
  图2. 简单的图形对象测试
 PHP 50创建图形的实用方法完整篇第1/3页
  这当然不如蒙娜丽莎漂亮,但是可以满足目前的工作需要。

[NextPage]

添加维数
  我们的第一个需求 —— 提供图形对象的能力 —— 已经满足了,现在应该开始满足第二个需求了:可以使用一个 z 值将一个对象放到其他对象的上面或下面。
  我们可以将每个 z 值当作是原始图像的一个面。所画的元素是按照 z 值从最小到最大的顺序来画的。例如,让我们画两个图形元素:一个红色的圆和一个黑色的方框。圆的 z 值是 100,而黑方框的 z 值是 200。这样会将圆放到方框之后,如图 3 所示:
  图3. 不同 z 值的面
 PHP 50创建图形的实用方法完整篇第1/3页
  我们只需要修改一下 z 值就可以将这个红圆放到黑方框之上。要实现这种功能,我们需要让每个 GraphicsObject 都具有一个 z() 方法,它返回一个数字,就是 z 值。由于您需要创建不同的图形对象(Line、Oval 和 Rectangle),您还需要创建一个基本的类 BoxObject,其他 3 个类都使用它来维护起点和终点的坐标、z 值和这个对象的颜色(请参看图 4)。
  图 4. 给系统添加另外一维:z 值
 PHP 50创建图形的实用方法完整篇第1/3页
  这个图形库的新代码如清单 3 所示:
  清单 3. 可以处理 z 信息的图形库

<?php 
class GraphicsEnvironment 
{ 
 public $width; 
 public $height; 
 public $gdo; 
 public $colors = array(); 
 public function __construct( $width, $height ) 
 { 
 $this->width = $width; 
 $this->height = $height; 
 $this->gdo = imagecreatetruecolor( $width, $height ); 
 $this->addColor( "white", 255, 255, 255 ); 
 imagefilledrectangle( $this->gdo, 0, 0, 
  $width, $height, 
  $this->getColor( "white" ) ); 
 } 
 public function width() { return $this->width; } 
 public function height() { return $this->height; } 
 public function addColor( $name, $r, $g, $b ) 
 { 
 $this->colors[ $name ] = imagecolorallocate( 
  $this->gdo, 
  $r, $g, $b ); 
 } 
 public function getGraphicObject() 
 { 
 return $this->gdo; 
 } 
 public function getColor( $name ) 
 { 
 return $this->colors[ $name ]; 
 } 
 public function saveAsPng( $filename ) 
 { 
 imagepng( $this->gdo, $filename ); 
 } 
} 
abstract class GraphicsObject 
{ 
 abstract public function render( $ge ); 
 abstract public function z(); 
} 
abstract class BoxObject extends GraphicsObject 
{ 
 protected $color; 
 protected $sx; 
 protected $sy; 
 protected $ex; 
 protected $ey; 
 protected $z; 
 public function __construct( $z, $color, $sx, $sy, $ex, $ey ) 
 { 
 $this->z = $z; 
 $this->color = $color; 
 $this->sx = $sx; 
 $this->sy = $sy; 
 $this->ex = $ex; 
 $this->ey = $ey; 
 } 
 public function z() { return $this->z; } 
} 
class Line extends BoxObject 
{ 
 public function render( $ge ) 
 { 
 imageline( $ge->getGraphicObject(), 
  $this->sx, $this->sy, 
  $this->ex, $this->ey, 
  $ge->getColor( $this->color ) ); 
 } 
} 
class Rectangle extends BoxObject 
{ 
 public function render( $ge ) 
 { 
 imagefilledrectangle( $ge->getGraphicObject(), 
  $this->sx, $this->sy, 
  $this->ex, $this->ey, 
  $ge->getColor( $this->color ) ); 
 } 
} 
class Oval extends BoxObject 
{ 
 public function render( $ge ) 
 { 
 $w = $this->ex - $this->sx; 
 $h = $this->ey - $this->sy; 
 imagefilledellipse( $ge->getGraphicObject(), 
  $this->sx + ( $w / 2 ), 
  $this->sy + ( $h / 2 ), 
  $w, $h, 
  $ge->getColor( $this->color ) ); 
 } 
} 
?> 
ログイン後にコピー

  测试代码也需要进行更新,如清单 4 所示。
  清单 4. 更新后的测试代码
<?php 
require_once( "glib.php" ); 
function zsort( $a, $b ) 
{ 
 if ( $a->z() < $b->z() ) return -1; 
 if ( $a->z() > $b->z() ) return 1; 
 return 0; 
} 
$ge = new GraphicsEnvironment( 400, 400 ); 
$ge->addColor( "black", 0, 0, 0 ); 
$ge->addColor( "red", 255, 0, 0 ); 
$ge->addColor( "green", 0, 255, 0 ); 
$ge->addColor( "blue", 0, 0, 255 ); 
$gobjs = array(); 
$gobjs []= new Oval( 100, "red", 50, 50, 150, 150 ); 
$gobjs []= new Rectangle( 200, "black", 100, 100, 300, 300 ); 
usort( $gobjs, "zsort" ); 
foreach( $gobjs as $gobj ) { $gobj->render( $ge ); } 
$ge->saveAsPng( "test.png" ); 
?> 
ログイン後にコピー

  此处需要注意两件事情。首先是我们添加了创建 Oval 和 Rectangle 对象的过程,其中第一个参数是 z 值。其次是调用了 usort,它使用了 zsort 函数来对图形对象根据 z 值进行排序。

当前1/3页 123下一页

以上就介绍了 PHP 50创建图形的实用方法完整篇第1/3页,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Huawei GT3 ProとGT4の違いは何ですか? Huawei GT3 ProとGT4の違いは何ですか? Dec 29, 2023 pm 02:27 PM

多くのユーザーはスマートウォッチを選ぶときにファーウェイブランドを選択しますが、その中でもファーウェイ GT3pro と GT4 は非常に人気のある選択肢であり、多くのユーザーはファーウェイ GT3pro と GT4 の違いに興味を持っています。 Huawei GT3pro と GT4 の違いは何ですか? 1. 外観 GT4: 46mm と 41mm、材質はガラスミラー + ステンレススチールボディ + 高解像度ファイバーバックシェルです。 GT3pro: 46.6mm および 42.9mm、材質はサファイアガラス + チタンボディ/セラミックボディ + セラミックバックシェルです。 2. 健全な GT4: 最新の Huawei Truseen5.5+ アルゴリズムを使用すると、結果はより正確になります。 GT3pro: ECG 心電図と血管と安全性を追加

機能とはどういう意味ですか? 機能とはどういう意味ですか? Aug 04, 2023 am 10:33 AM

ファンクションとは、関数を意味します。これは、特定の関数を備えた再利用可能なコード ブロックです。プログラムの基本コンポーネントの 1 つです。入力パラメータを受け取り、特定の操作を実行し、結果を返すことができます。その目的は、再利用可能なコード ブロックをカプセル化することです。コードの再利用性と保守性を向上させるコード。

修正: Windows 11 で Snipping ツールが機能しない 修正: Windows 11 で Snipping ツールが機能しない Aug 24, 2023 am 09:48 AM

Windows 11 で Snipping Tool が機能しない理由 問題の根本原因を理解すると、適切な解決策を見つけるのに役立ちます。 Snipping Tool が正しく動作しない主な理由は次のとおりです。 フォーカス アシスタントがオンになっている: これにより、Snipping Tool が開かなくなります。破損したアプリケーション: 起動時にスニッピング ツールがクラッシュする場合は、破損している可能性があります。古いグラフィック ドライバー: 互換性のないドライバーは、スニッピング ツールに干渉する可能性があります。他のアプリケーションからの干渉: 実行中の他のアプリケーションが Snipping Tool と競合する可能性があります。証明書の有効期限が切れています: アップグレード プロセス中のエラーにより、この問題が発生する可能性があります。これらの簡単な解決策は、ほとんどのユーザーに適しており、特別な技術知識は必要ありません。 1. Windows および Microsoft Store アプリを更新する

iOS の開発者バージョンとパブリック バージョンの違いは何ですか? iOS の開発者バージョンとパブリック バージョンの違いは何ですか? Mar 01, 2024 pm 12:55 PM

毎年、Apple が iOS と macOS の新しいメジャー バージョンをリリースする前に、ユーザーは数か月前にベータ版をダウンロードして最初に体験することができます。同ソフトウェアは一般ユーザーと開発者の両方が使用するため、Appleは開発者向けベータ版のパブリックベータ版である開発者版とパブリック版を両方向けに開始した。 iOS の開発者バージョンとパブリック バージョンの違いは何ですか?文字通りに言うと、開発者バージョンは開発者テスト バージョンであり、パブリック バージョンは公開テスト バージョンです。開発者バージョンとパブリック バージョンは、異なるユーザーを対象としています。開発者バージョンは、Apple が開発者によるテストのために使用します。ダウンロードしてアップグレードするには、Apple 開発者アカウントが必要です。

iPhoneでApp Storeに接続できないエラーを修正する方法 iPhoneでApp Storeに接続できないエラーを修正する方法 Jul 29, 2023 am 08:22 AM

パート 1: 最初のトラブルシューティング手順 Apple のシステムステータスを確認する: 複雑な解決策を掘り下げる前に、基本から始めましょう。問題はデバイスにあるのではなく、Apple のサーバーがダウンしている可能性があります。 Apple のシステム ステータス ページにアクセスして、AppStore が適切に動作しているかどうかを確認してください。問題があれば、Apple が修正してくれるのを待つしかありません。インターネット接続を確認します。「AppStore に接続できません」問題は接続不良が原因である場合があるため、安定したインターネット接続があることを確認してください。 Wi-Fi とモバイル データを切り替えるか、ネットワーク設定をリセットしてみてください ([一般] > [リセット] > [ネットワーク設定のリセット] > [設定])。 iOS バージョンを更新します。

Python の「enumerate()」関数の目的は何ですか? Python の「enumerate()」関数の目的は何ですか? Sep 01, 2023 am 11:29 AM

この記事では、Python の enumerate() 関数と「enumerate()」関数の目的について学びます。 enumerate() 関数とは何ですか? Python の enumerate() 関数は、データ コレクションをパラメータとして受け取り、列挙オブジェクトを返します。列挙オブジェクトはキーと値のペアとして返されます。キーは各項目に対応するインデックス、値は項目です。構文 enumerate(iterable,start) パラメータ iterable - 渡されたデータ コレクションは、iterablestart と呼ばれる列挙オブジェクトとして返すことができます。 - 名前が示すように、列挙オブジェクトの開始インデックスは start によって定義されます。無視したら

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 Jun 13, 2016 am 10:23 AM

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code

MySQL.procテーブルの役割と機能の詳しい説明 MySQL.procテーブルの役割と機能の詳しい説明 Mar 16, 2024 am 09:03 AM

MySQL.proc テーブルの役割と機能の詳細な説明。MySQL は人気のあるリレーショナル データベース管理システムです。開発者が MySQL を使用する場合、多くの場合、ストアド プロシージャ (StoredProcedure) の作成と管理が必要になります。 MySQL.proc テーブルは非常に重要なシステム テーブルであり、ストアド プロシージャの名前、定義、パラメータなど、データベース内のすべてのストアド プロシージャに関連する情報が保存されます。この記事では、MySQL.proc テーブルの役割と機能について詳しく説明します。

See all articles