PHPにおけるGDライブラリの使用を一緒に学ぶ(一)

6450 ワード

またおなじみのライブラリに着きました.画像グラフィックの処理にとって、GDライブラリはPHPerたちが迂回できない壁です.早くからCMSやDiscuzの時代から、各種のオープンソースソフトウェアはインストール時にGDライブラリが必須の拡張であることを明確に指摘していた.もちろん、現在のPHPバージョンでは、コンパイル時にこのライブラリを無視することはないと信じています.画像に透かしを付けたり、サムネイルを生成したり、検証コードの画像を作成したりしても、GDライブラリの姿は欠かせません.
もちろん、GDライブラリでよく使われている関数や面白い関数を浅く深く学びます.
現在の環境におけるGDライブラリ情報
まず、現在のPHP環境のGDライブラリのバージョンとサポートされているピクチャフォーマット情報を確認できます.
var_dump(gd_info());
// array(13) {
//     ["GD Version"]=>
//     string(26) "bundled (2.1.0 compatible)"
//     ["FreeType Support"]=>
//     bool(true)
//     ["FreeType Linkage"]=>
//     string(13) "with freetype"
//     ["GIF Read Support"]=>
//     bool(true)
//     ["GIF Create Support"]=>
//     bool(true)
//     ["JPEG Support"]=>
//     bool(true)
//     ["PNG Support"]=>
//     bool(true)
//     ["WBMP Support"]=>
//     bool(true)
//     ["XPM Support"]=>
//     bool(false)
//     ["XBM Support"]=>
//     bool(true)
//     ["WebP Support"]=>
//     bool(true)
//     ["BMP Support"]=>
//     bool(true)
//     ["JIS-mapped Japanese Font Support"]=>
//     bool(false)
//   }

gd_info()関数は現在のGDライブラリのバージョン情報を表示することができ、他のフィールドは各種のピクチャモードのサポート状況であり、私のシステム環境ではXPMのようなフォーマットがサポートされていない以外、その他の各種のピクチャフォーマットが正常にサポートされていることがわかります.最後は日本語フォントのサポートで、現在の環境にもありません.
画像の基本情報の取得
getimagesize()は、画像情報を取得するこの関数で、名前から見ると画像サイズを取得する関数ですが、他の情報も含まれています.また、この関数はGDライブラリとはあまり関係ありません.つまり、GDライブラリの拡張は必要ありません.実はこの関数も使用できます.
var_dump(getimagesize("../img/1.png"));
// array(6) {
//     [0]=>
//     int(150)
//     [1]=>
//     int(150)
//     [2]=>
//     int(3)
//     [3]=>
//     string(24) "width="150" height="150""
//     ["bits"]=>
//     int(8)
//     ["mime"]=>
//     string(9) "image/png"
//   }

返された結果はとても簡単で、0と1はそれぞれ画像の幅が広く、2は画像のタイプで、前の文章では対応しているのがIMAGETYPEだと言いました.定数に対応するピクチャタイプ.3は文字形式の画像幅が高く、imgタグに直接使用できるので、PHPは本当にwebのために生まれた言語なのか、画像サイズ取得の関数にもこのような属性を持って帰ってくることがわかります.bitsは画像の色ビット数です.mimeは画像のMIMEタイプです.
また、getimagesize()関数には2番目のパラメータがあります.これは参照タイプのパラメータで、1つの関連配列で異なるJPG APP IDを返します.つまり、JPG関連の画像についても追加の情報を取得していますが、実は前回の記事で学んだEXIFの情報に似ています.
var_dump(getimagesize("../img/2.jpg", $info));
// array(7) {
//     [0]=>
//     int(300)
//     [1]=>
//     int(244)
//     [2]=>
//     int(2)
//     [3]=>
//     string(24) "width="300" height="244""
//     ["bits"]=>
//     int(8)
//     ["channels"]=>
//     int(3)
//     ["mime"]=>
//     string(10) "image/jpeg"
//   }

var_dump($info);
// array(1) {
//     ["APP0"]=>
//     string(14) "JFIF��"
//   }

また,JPGピクチャであればチャネル属性を1つ多く返し,ピクチャがRBGフォーマットであれば3,CMYKフォーマットであれば4を返す.
getimagesize()を使用してリモートファイルの情報を取得することもできます.
var_dump(getimagesize("https://upload-images.jianshu.io/upload_images/1074666-8df66a94d61cac74.png?imageMogr2/auto-orient/strip|imageView2/2/w/374/format/webp"));
// array(6) {
//     [0]=>
//     int(374)
//     [1]=>
//     int(617)
//     [2]=>
//     int(18)
//     [3]=>
//     string(24) "width="374" height="617""
//     ["bits"]=>
//     int(8)
//     ["mime"]=>
//     string(10) "image/webp"
//   }

画像ファイルを直接操作するほか、文字列から画像の情報を直接取得することもできます.しかし、これらの文字列は一般的に読み込まれたピクチャファイルのバイナリ情報である.本当のHello Worldのような文字列を直接言っても、それを殺しても画像の内容は解析できません.
$data = file_get_contents('../img/1.png');
var_dump(getimagesizefromstring($data));
// array(6) {
//     [0]=>
//     int(150)
//     [1]=>
//     int(150)
//     [2]=>
//     int(3)
//     [3]=>
//     string(24) "width="150" height="150""
//     ["bits"]=>
//     int(8)
//     ["mime"]=>
//     string(9) "image/png"
//   }

画像の情報を取得
画像のタイプでファイルの拡張子を取得できます.このタイプの定数もIMAGETYPEです.を選択して設定できます.
var_dump(image_type_to_extension(IMAGETYPE_PNG)); // string(4) ".png"
var_dump(image_type_to_extension(IMAGETYPE_JPEG, FALSE)); // string(4) "jpeg"

image_type_to_extension()関数には2番目のパラメータがあり、falseに設定すればそれを付けません.
var_dump(image_type_to_mime_type(IMAGETYPE_PNG)); // string(9) "image/png"
var_dump(image_type_to_mime_type(IMAGETYPE_JPEG)); // string(10) "image/jpeg"

同様に、image_もありますtype_to_mime_type()という関数は,ピクチャのMIME情報の内容を得る.また、現在のシステムでサポートされているピクチャタイプがどのようなものであるかを取得する関数もあります.
var_dump(imagetypes()); // int(111)

えっ、おかしいですね.どうして111個しか戻ってこなかったのですか.実際には、現在のシステムにPNGピクチャのサポートがあるかどうかを知りたい場合など、保存されているバイナリピクチャサポート情報です.
var_dump(imagetypes() & IMAGETYPE_PNG); // int(3)

とIMAGETYPE_PNGとその後の結果はIMAGETYPE_PNG自体の値は、現在のシステムでこのピクチャタイプの動作がサポートされていることを示している.
小例:自分の画像を作成する
最後に、GDライブラリのこれらの関数を使用して簡単な小さな画像を作成する例を見てみましょう.
$im = @imagecreate(100, 50) or die("Cannot Initialize new GD image stream");
$background_color = imagecolorallocate($im, 255, 255, 255);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5,  "Test   ", $text_color);
imagepng($im, '../img/test.png');
imagedestroy($im);

実は各関数の内容はよく理解されていて、関数名はもうはっきり書いてあります.もちろん、私たちの後の文章では詳しくもう一度勉強します.この最終的に生成された画像の中で、中国語も文字化けしているが、画像検証コードとして使用できるようになったのは、非常に簡単ではないだろうか.
まとめ
今日の内容は多くなくて、すべて比較の基礎の浅いいくつかの関数の使用です.もちろん、これは冒頭の最初の文章にすぎません.GDライブラリは簡単な拡張ではありません.その中の内容は非常に多く、実現できる機能も非常に複雑です.離れないで、注目し続けてください.
テストコード:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202012/source/1.PHP中のGDライブラリの使用を一緒に学ぶ(一).php
参照ドキュメント:
https://www.php.net/manual/zh/book.image.php
各メディアプラットフォームで検索可能【ハードコアプロジェクトマネージャ】