ホームページ >バックエンド開発 >PHPチュートリアル >PHP によるグラフィック処理_PHP チュートリアル
グラフィック処理
PHP グラフィックス処理、主な機能は PHP グラフィックス処理機能に焦点を当てています。
最初にいくつかの重要なポイントをマスターする必要があります。画像とは何か、そしてそれを表示する方法。
いわゆる写真は実際には一種のファイルですが、その内容は私たちの肉眼で直接見ることはできません。メモ帳で画像を開くと文字化けするだけです。実際、これらの文字化けコードは、私にとっては単なる文字化けコードです。読み書きできるプログラムであれば、まったく面倒ではありません。画像の形式がわかっていれば、自分で画像を生成できます。初期の頃に作ったメモ帳やゲストブックのように。
いくつかの特別な形式のデータをファイルに保存して画像を生成します。逆に、PHP を使用してコンテンツを直接出力すると、ブラウザもそれを画像だと認識します。
まずこれを確認しましょう。まず写真を準備します。より小さい JPG 形式にすることをお勧めします。次に、PHP を使用して、通常のファイルと同じようにこの画像を読み取ります。
$file = "1.jpg";
$fp = fopen($file, "rb");
$data = fread( $fp, filesize($file));
fclose($fp);
$data をエコー;
?>
学生にとっては、このコードで問題ないと思います。
ファイルを開き、内容 (全バイト) を読み取り、ファイルを閉じて、内容を出力します。
このコードを実行した学生はいますか? スクリーンショットを撮って、出力される内容を確認してください。
おそらくクラスメートの中には、なぜ文字化けしているのか驚く人もいるでしょう。
ブラウザはデフォルトで PHP 出力がテキストであると認識するためです。たとえそれが意味不明なものであっても、これが写真であることをブラウザーに伝える必要があります。これには、header 関数を使用してヘッダー情報を送信し、現在の出力コンテンツがグリッド形式であることをブラウザーに伝える必要があります。
Header("Content-type: image/jpeg");
JPG形式の画像に使用されるヘッダー情報です。 コンテンツタイプ: image/jpeg エコーの前に追加する必要があります。
$file = "1.jpg";
$fp = fopen($file, "rb");
$data = fread( $fp, filesize($file));
fclose($fp);
Header("Content-type: image/jpeg");
$data をエコー;
?>
生徒の皆さん、もう一度試してください。
このコードは 1 つのことを証明しています。出力が文字化けしたコードであっても、ブラウザーがそれが何であるかを認識している限り、正しく表示できるということです。
逆に、読み取った内容を別のファイルに保存すると、この画像をコピーできます。
ここで、一部の生徒が誤解をしているかもしれません。これはまだウェブページだと思います。学生は、開いた Web ページの空白部分を右クリックしてソース ファイルを表示してみてください。そのようなオプションがないことがわかります。あったとしてもグレーです。これは、ブラウザがすでに PHP プログラムを画像であると認識しているためです。
通常、何らかの形式の出力に PHP を使用する場合、ブラウザはそれを HTML Web ページであると認識し、ソース コードのみを表示します。
画像コンテンツを出力する場合、それを正しく表示するには、この出力を Web ページとしてではなく画像として扱うようにブラウザーに指示する必要があります。言い換えれば、php プログラムは画像です。この画像を他の Web ページで使用したい場合は、通常どおり
この PHP プログラムを直接記述するのではなく、画像として扱います。
これは間違っています。結果は 1 つだけです。
これを表示することは不可能です。
したがって、PHP を使用して画像を処理するプログラムは、単機能の PHP プログラムでなければなりません。画像をエクスポートせずに保存する場合を除きます。
$file = "1.jpg";
$fp = fopen($file, "rb");
$data = fread( $fp, filesize($file));
fclose($fp);
$fp = fopen("2.jpg", "wb");
fwrite($fp, $data);
fclose($fp);
?>
コードがこのように書かれている場合は別問題であり、何も問題はありません。画像を別の場所に保存し、HTML を出力して画像を呼び出します。画像を直接出力したい PHP プログラムは、他の出力を含めてはならず、役に立ちません。意味不明な画像の内容を単純に出力することしかできません。
画像の読み込み、出力には問題ありません。
ファイルの内容は私たちにも理解できない特殊な形式です。どうすればよいですか?
PHP は特殊なグラフィック処理機能を提供します。
グラフィックス処理機能ライブラリにはGDライブラリという専用の名前が付いています。
この関数ライブラリは PHP には付属していません。 PHPのインストール時にphp.iniでloadingの設定を行う必要があります。
ライブラリファイルの名前はphp_gd2.dllです。これは、PHP インストール パッケージの ext ディレクトリに含まれています。学生の php.ini に GD ライブラリがロードされていない場合は、今すぐ開いてください。
このように、PHPにはグラフィック処理機能が用意されています。
PHP に付属する GD ライブラリの現在のバージョンは 2.0.28 です。 PHP 4 には gd 2.0 が付属し、PHP 3 には gd 1.6 が付属します。
なぜこれについて言及する必要があるのですか?
gd 2.0 がリリースされたときの GIF 画像の著作権の問題のため。無料のオープンソース言語である PHP は、GIF 著作権所有者に著作権料を支払うことができないため、GIF 画像のサポートを一時停止することしかできません。 PHP 5 以降、GIF の著作権は期限切れになり、PHP は再び GIF 画像をサポートします。
それでは、PHP マニュアルを開いて、Image image 関数を見てみましょう。
機能はたくさんありますが、大きく分けると作成、ペイント、設定、出力の4つに分けられます。
画像を作成したい場合は、imagecreate関数を使用できます。関数名からもわかるように、イメージを作成します。マニュアルから構文形式を確認できます。
画像リソース imagecreate(width, height) を返す
幅と高さはピクセル単位です。
新しい True Color イメージを作成し、より多くの色をサポートする imagecreatetruecolor という別の関数があります。
クラスを作成する関数は画像リソースを返します。これは fopen 関数の戻りに似ています。リソースタイプのデータには、内部に読み取り/書き込みポインターが含まれており、画像を編集できます。
まず、imagecreate 関数を使用して画像を作成してみましょう。
この画像を表示するには、エクスポートする必要があります。しかし、私たちの経験から、リソースベースのコンテンツは直接出力できないことがわかります。
画像形状関数はいくつかの機能を提供します:
JPG形式でのimagejpeg出力
imagegif GIF形式で出力
imagepng PNG形式で出力
関数の形式は同じです。
imagejpeg(画像リソース, [保存パス])
この画像を保存する必要がある場合は、2 番目のパラメータにファイル名を書き込むだけです。直接出力したいだけの場合は、2 番目のパラメータを未記述のままにしておきます。
この画像を直接出力してみましょう。
Header("Content-type: image/JPEG");
$img =imagecreate(100, 100);
imagejpeg($img);
100*100の画像を作成し、JPG形式でエクスポートします。これが画像であることをブラウザに忘れずに伝えてください。
手術の結果はどうなりましたか?クラスメートの誰かがスクリーンショットを撮って見てもいいですか?
はい、黒い画像が出力されます。なぜなら、私たちはそこに何も描いていないし、何色にすべきかも指示していないからです。
より簡単な操作から始めて、色をペイントしてみましょう。これには、imagecolorallocate 関数を使用する必要があります。
機能は次のとおりです: 画像に色を割り当てます
関数の形式は次のとおりです
imagecolorallocate(画像リソース、赤、緑、青)
三原色、0から255の数字で表されます。 0 が最も暗く、255 が最も明るいです。白が必要な場合は、3 色すべてが 255 です。黒は 3 色が 0 です。赤だけが必要な場合は、255 0 0 です。
header("Content-type: image/jpeg");
$img =imagecreate(100, 100);
imagecolorallocate($img, 255,0,0);
imagejpeg($img);
真っ赤で塗りつぶしていきます。学生は自分で試して、赤、緑、青にそれぞれ値を設定して結果を確認できます。このカラーマッチングにはある程度の知識が必要です。学生はさまざまな描画ツールでこの色を直接取得することもできます。
右下隅の赤、緑、青の値は直接使用できます。多くのソフトウェアには同様のカラー パレットがあり、さまざまな色の値を簡単に取得できます。
ここで一つ注意点があります。
imagecolorallocate関数は、初回使用時のみ画像の背景色を塗りつぶし、再度使用しても背景色は変更されません。
header("Content-type: image/jpeg");
$img =imagecreate(100, 100);
imagecolorallocate($img, 255,0,0);
imagecolorallocate($img, 0, 0, 255);
imagejpeg($img);
このコードは期待した青色を出力しません。ただし、機能が役に立たないというわけではありません。この機能は引き続き機能しますが、色が使用されないだけです。この色は、書き込みなどの他の目的に使用できます。
画像に点字を書いてみましょう。
PHPが提供する関数の中には、imagestringとimagestringupという画像への書き込みに使用できる関数が2つあります。
画像文字列は横書きです
imagestringupは縦書きを意味します
imagestringup を使って書くと、首をひねって読まなければなりません。さて、最初に画像文字列を使用しましょう。
imagestring関数のプロトタイプ
画像文字列(画像リソース、フォント、開始X座標、開始Y座標、書き込む単語、色)
PHP には 5 つのフォントのみが付属しており、1 から 5 までの数字で表す必要があります。
試してみましょう。
header("Content-type: image/jpeg");
$img =imagecreate(100, 100);
imagecolorallocate($img, 255,0,0);
$color = imagecolorallocate($img, 0, 0, 255);
imagestring($img, 4, 0,0, 'abcdef', $color);
imagejpeg($img);
おじさん、まぶしいので白背景に変更して見栄えを良くします。
中国語で書こうとする生徒はいますか?結果は残念なものになる可能性があります。
PHP に付属のフォントが非常に弱いため、中国語の文字を適切に表示できないためです。どうやってするの?
カスタムフォント。
image 関数は、カスタム フォントを使用して書き込むことができる別の関数を提供します。厳密に言えば「絵を描く」ことです。ビットマップ形式のフォント ファイルが必要で、中国語をサポートしている必要があります。最も一般的なフォントは ttf タイプです。グラフィックデザインをやったことがあれば、これはよく知っていると思いますが、やったことがなくても問題ありません。そのうちのいくつかを取り出して、システムで使用できます。システムに付属のフォント ファイルは C:windowsfonts ディレクトリにあり、その中に中国語をサポートするフォントがあります。 WIN システムに付属のフォントのほとんどは中国語をサポートしています。私は Microsoft Yahei を選択します。 PHP に戻ります。
このフォント ファイルを使用してテキストを描画するには、imagettftext 関数を使用する必要があります。
imagettftext関数プロトタイプ
imagettftext (画像リソース、フォントサイズ、フォント方向、開始X座標、開始Y座標、フォントカラー、フォントファイル、書き込む単語)
母さん、パラメータがたくさんあります。皆さんもこれほどパラメータが多い関数を使うのは初めてだと思います。
//画像を作成して背景を白に設定します
$img =imagecreate(100, 100);
imagecolorallocate($img, 255,255,255);
//色を用意してください
$color = imagecolorallocate($img, 0, 0, 255);
//フォントファイルを準備します
$font = "msyhbd.ttf";
//画像リソース、フォントサイズ、フォント方向、開始X座標、開始Y座標、フォントカラー、フォントファイル、書き込む単語
imagettftext($img, 14, 0, 20, 20, $color, $font, "中国語サポート");
//JPG形式の出力画像
imagejpeg($img);
この画像ファイルは、パスが現在のディレクトリにない場合、その場所を PHP に伝えます。
例: $font = "./font/msyhbd.ttf";
または $font = "C:\windows\fonts\msyhbd.ttf";
PHP にこのフォント ファイルを検出させる必要があります
imagettftext($img, 14, 180, 150, 150, $color, $font, "中国語サポート");
フォントの方向を180度にして、結果はこのようになります。さらに、ここでは中国語を utf8 でエンコードする必要があります。これは簡単で、PHP ファイルを utf8 エンコーディングに変換するだけです。 gbk エンコードを使用している学生は、フォント エンコードを変換できます。
$text = iconv("gbk", "utf-8", "中国語サポート");
十分なフォントがある限り、PHP に任意のスタイルを出力させることができます
$font = "FZKANGFW.TTF";
$text = iconv("gbk", "utf-8", "中国語サポート");
imagettftext($img, 20, 0, 150, 150, $color, $font, $text);
この効果は、事前に定義された変数 $_SERVER を使用して実現できます。
$_SERVER['REMOTE_ADDR']
このサーバー変数は訪問者の IP アドレスを取得できます。このようにして、インターネット上のIP表示による様々な映像が制作されます。写真に一言書くだけじゃないの?
わかりました。それでは、それについて学びましょう。その上に線を描きます。
描画機能が豊富です。
imagedashedline - 破線を描画します
imagedestroy - 画像を破棄します
imageellipse - 楕円を描きます
imagefill - 領域の塗りつぶし
imagefilledarc - 楕円弧を描いて塗りつぶします
imagefilledellipse - 楕円を描いて塗りつぶします
imagefilledpolygon - 多角形を描いて塗りつぶします
imagefilledrectangle - 長方形を描いて塗りつぶします
線画はイメージラインです。その他の描画機能については、生徒が自分でマニュアルを参照できます。
これを見ると、原則は、画像リソース上で、どの色を使用するか、どの座標から開始するか、何を描画するかということに他なりません。
イメージライン関数のプロトタイプ
(画像データ、開始X座標、開始Y座標、終了X座標、終了Y座標、色)
数学では、XY 座標が平面上の点を決定し、2 つの点が線分を決定できることを知っています。
//画像を作成して背景を白に設定します
$img =imagecreate(300, 300);
imagecolorallocate($img, 200,200,200);
//色を用意してください
$color = imagecolorallocate($img, 0, 0, 255);
//この色で線を描きます
イメージライン($img, 0,150, 300,150, $color);
//JPG形式の出力画像
imagejpeg($img);
私の画像は300*300のサイズです。 0,150 からは左端の中央の位置から、右端の中央の位置になります。
グリッドを描画したい場合は、ゆっくりと座標を計算してから再度描画してください。
for($i=0; $i
$y = $i*50;
イメージライン($img, 0,$y, 300,$y, $color);
}
縦線などについてはあまり言いません。
他にもさまざまな線や形があり、生徒はマニュアルの指示に従って自分で練習できます。
多くの場合、私たちの写真は既成のものです。私たちがしなければならないのは、サイズを縮小してトリミングすることだけです。
画像は既製なので、画像をロードする必要があります。画像の種類に応じて、画像をロードするためにさまざまな関数が必要です。
imagecreatefromjpeg JPG ファイルから画像を作成します
gifから画像を作成
png PNG から画像を作成
wbmp WBMP から画像を作成
xbm XBM から画像を作成
ロードするために使用される画像の種類は何ですか?これらの関数はすべて作成クラス関数に属します。以前は書き込み機能と線画機能を使用していましたが、これらはすべてペイント機能でした。この区別があると、機能が多すぎるとは感じなくなります。実際には、タイプが異なるだけで、多くの関数が繰り返されます。すべての操作はキャンバスとキャンバス上に描画されたものに対して行われます。
実際、PHP では画像のサイズを縮小することはできません。それは単なる思考テクニックです。イメージコピー関数imagecopymergeを使用します。
画像の一部を別の画像にコピーすることもできます。imagecopyresampled という同様の関数もあります。これらはすべて、画像の一部を別の画像にコピーします。これは、そのような操作には 2 つのイメージが必要であることを意味します。 1 つは元のイメージで、もう 1 つは新しく生成されたイメージです。
元の画像。一連の関数の画像を使用してロードできます。新しい写真は自分たちで作ることができます。次に、イメージ コピー機能を使用して、元のイメージから新しいイメージにコピーします。
1つの領域だけをコピーする場合は、クロップ機能です。画像全体のサイズでコピーし、新しい画像のサイズが元の画像と異なる場合、つまり画像サイズ、つまりサムネイルを変更するか、画像を拡大します。
$image = "1.jpg";
//画像サイズを読み取る
list($width, $height) = getimagesize($image);
//画像をロード
$bimg = imagecreatefromjpeg($image);
//新しい画像を作成します。サイズは元の画像の半分です
$simg =imagecreatetruecolor($width * 0.5, $height * 0.5);
//元画像の上に、元画像全体を半分に縮小してコピーします
imagecopyresampled($simg, $bimg, 0,0, 0,0, $width*0.5, $height*0.5, $width, $height );
//小さい画像をJPG形式で出力します
imagejpeg($simg);
新しい画像を作成するために imagecreatetruecolor が使用されていることを発見した生徒もいるかもしれません。 imagecreate の代わりに True Color イメージ。学生はそれを試して、imagecreate を使用したときの結果を確認できます。
画像をコピーします。imagecopyresampled 関数を選択し、コピーしてサイズ変更します。同様の関数には imagecopyresize があります。
画像コピーのサイズ変更
画像コピー再サンプリング
これらの関数は両方とも、画像をコピーしてサイズ変更します。学生は自分たちの違いを自分でテストできます。パラメータが多すぎるので、ここで注釈を付けます。
新しい写真、元の写真、
新しい画像の開始点は X、新しい画像の開始点は Y、
元の画像の開始点は X、元の画像の開始点は Y、
新しい画像の幅、新しい画像の高さ、
元画像の幅、元画像の高さ
2 人のグループに分かれて作業し、一緒に見てください。
//画像をロード
$bimg = imagecreatefromjpeg($image);
//新しい画像を作成します。サイズは元の画像の半分です
$simg =imagecreatetruecolor($width * 0.5, $height * 0.5);
//元画像の上に、元画像全体を半分に縮小してコピーします
imagecopyresampled($simg, $bimg, 0,0, $width*0.5, $height*0.5, $width, $height, $width, $height );
このコードの意味は
$simg, $bimg, //新しい画像、元の画像
0,0, //新しい絵の0*0から描画を開始します
$width*0.5, $height*0.5, //元の画像の中心点からサンプルします
$width, $height, //新しい画像と元の画像は同じサイズです。
$width, $height //元画像の右下隅の座標で終了
作成された画像は元の画像の半分しかないため、このコードは最終的な画像に元の画像の中心点のみを表示するようにします。右下隅のコンテンツ。つまり、元の画像の 1/4 がいわゆるトリミングになります。
これらの関数にはパラメーターが多すぎるため、各サンプリング座標を計算するときはさらに注意する必要があります。
透かし画像の原理は同じです。 2 つの画像をロードし、2 つの画像オブジェクトを作成します。次に、透かし画像を元の画像にコピーします。麺。実際、それは単なる思考のテクニックにすぎません。
グラフィック機能については以上です。
まず、このレッスンの要点をまとめておきます。
1. 必ず最初にイメージを作成し、ロードするか、自分で作成してください。
2. 画像上に描画、線、図形のみを作成できます
3. テキストは UTF8 でのみエンコードできます。中国語を表示するには、中国語フォントが必要です。
4. 画像自体を直接調整することはできません。調整できるのはコピープロセス中にのみです。
5. 画像を直接出力したい場合、このプログラムは他の不要なものを出力することはできません
6. 画像を直接出力するプログラムはピクチャとして呼び出す必要があります。
画像機能。いくつかのカテゴリに分かれています:
クラスの作成: imagecreate、imagecreatefromjpeg
設定クラス: imagecolorallocate、getimagesize
描画クラス: imagecopyresampled、imageline、imagettftext
出力クラス: imagejpeg、imagepng
描画クラスには最も多くの関数があり、関数の形式もよく似ています:
画像のXX座標にXXのものを描きます
コピー操作の機能には8個もの座標がある場合が多いです。
元の画像の開始点の座標、元の画像の幅と高さ、つまり 4 つです。
新しい画像の開始点の座標、新しい画像の幅と高さ、ここにさらに 4 つあります。オリジナル画像と新しい画像を追加しました。パラメータは約 10 個あります。
したがって、一般的な画像処理プロセスでは、プログラムをデバッグした後、戻って再度変更することは望まれません。それをカスタム関数にカプセル化します。
例えばサムネイル機能。
関数 size_img($img, $width, $height) {
真ん中で扱うだけです。
}
このようにして、画像を提供し、出力サイズを指定してサムネイルを生成します。少なくとも、はるかに使いやすくなりました。