スクリプトは、PHPで記述されたPNG形式の51x51ピクセルの画像の形式でサイトに登録するための招待状を生成し、データベースとしてMySQLを使用します。 楽しみのために作られた、それは初心者だけに興味があります。
GDライブラリを使用すると、さまざまな形式の画像を簡単に作成および編集できます。 画像を作成するには、いくつかの機能が必要です。
int imagecolorallocate(resource image, int red, int green, int blue)
* This source code was highlighted with Source Code Highlighter .
そして
int imagecolorallocatealpha(resource image, int red, int green, int blue, int alpha)
* This source code was highlighted with Source Code Highlighter .
両方の関数は、画像の色識別子を返します。 唯一の違いは、画像の透明度を設定するalphaパラメーターです。 しかし、古くからIEのPNG透過性に問題があったため、最初の関数を使用する方が適切です。
画像の最初の引数は、関数を使用して取得できます。
resource imagecreate( int x, int y)
* This source code was highlighted with Source Code Highlighter .
サイズx x yの空のパレット画像を表す画像識別子を返します。
まず、データベースにテーブルを作成する必要があります。
CREATE TABLE IF NOT EXISTS `di_invite` (
`invite_id` int (15) unsigned NOT NULL AUTO_INCREMENT,
`invite_hash` varchar (32) COLLATE utf8_unicode_ci DEFAULT NULL ,
`invite_serialize` text COLLATE utf8_unicode_ci,
`invite_username_owner` varchar (25) COLLATE utf8_unicode_ci DEFAULT NULL ,
`invite_username_recipient` varchar (25) COLLATE utf8_unicode_ci DEFAULT NULL ,
PRIMARY KEY (`invite_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE =utf8_unicode_ci AUTO_INCREMENT=1 ;
* This source code was highlighted with Source Code Highlighter .
データベースには、各招待の一意の識別子(invite_id)、招待のハッシュ(invite_hash)、4つのRGBコンポーネントの配列、バイトストリーム表現(invite_serialize)、招待所有者のニックネーム(invite_username_owner)およびそれをアクティブにしたユーザーのニックネーム(invite_username_recipient)が保存されます。
次に、4色それぞれの赤、緑、青の成分の値を含む3x4配列を作成し、データベースに書き込む必要があります。
- 関数add_invite(){
- // 4つのランダムな色を作成し、配列に書き込みます
- $ rgb_array =配列();
- for ($ idx = 0; $ idx <4; ++ $ idx){
- $ rgb = array();
- for ($ idx2 = 0; $ idx2 <3; ++ $ idx2)$ rgb [] = mt_rand(0、255);
- $ rgb_array [] = $ rgb;
- }
- //データベースに書き込むために配列をバイトストリーム表現に変換します
- $ serialize = serialize($ rgb_array);
- //ハッシュ招待
- $ hash = md5($ serialize);
- //挿入
- $ _CORE [ 'db' ]-> query( 'INSERT INTO `di_invite`(` invite_hash`、 `invite_serialize`、` invite_username_owner`)VALUES(?、?、?);' 、$ Hash、$ serialize、$ _CORE [ 'user' ]-> user_info [ 'user_name' ]);
- if ($ _CORE [ 'db' ]-> Influence_rows()== 1) return array( true 、 'Invite "' 。$ hash。 '" created' );
- そうでない場合は、配列を返し ます ( false 、 'ERROR-database error' );
- trueを 返し ます 。
- }
*このソースコードは、 ソースコードハイライターで強調表示されました。
この招待をユーザーに与える方法について考える必要があります。 もちろん、これを行う最も簡単な方法は、画像として表示することです。 画像を生成するときは、アクティブな招待ではなく、白黒の写真を提供する価値があることを考慮する必要があります。それ以外の場合は、本格的な4色の招待です。
- if (isset($ _ GET [ 'hash' ] {31})){
- //そのようなハッシュを持つデータベースで招待を探します
- $ result = $ _CORE [ 'db' ]-> query( 'SELECT `di_invite`.`invite_serialize`、` di_invite`.`invite_username_recipient` FROM `di_invite` WHERE` di_invite`.`invite_hash` = ?;' 、$ hash );
- //見つかった場合
- if ($ result && $ _CORE [ 'db' ]-> num_rows()== 1){
- //招待が既に使用されている場合は、白黒写真を提供します
- if ($ _CORE [ 'db' ]-> result($ result、0、 'invite_username_recipient' )!= '' ){
- //これが画像であることをブラウザに伝えます
- header( 'Content-type:image / png' );
- // 51x51の正方形を作成します
- $ im = ImageCreate(51、51)またはdie( 'Error creating image' );
- //グレーと白の2色を選択し、白が画像の背景として使用されます
- $ color [1] = imagecolorallocate($ im、255、255、255);
- $ color [2] = imagecolorallocate($ im、200、200、200);
- // 2つの灰色の長方形を斜めに描画します
- ImageFilledRectangle($ im、26、0、50、25、$ color [2]);
- ImageFilledRectangle($ im、0、25、25、50、$ color [2]);
- //画像をブラウザに出力します
- ImagePng($ im);
- //それを破壊します
- imagedestroy($ im);
- //それ以外の場合、招待がまだ使用されていない場合
- } else {
- //配列を復元します
- $ rgb_array = unserialize(mysql_result($ result、0、 'invite_serialize' ));
- header( 'Content-type:image / png' );
- $ im = ImageCreate(51、51)またはdie( 'Error creating image' );
- //配列値から4色を選択します
- for ($ i = 0; $ i <4; ++ $ i)
- $ color [$ i] = imagecolorallocate($ im、$ rgb_array [$ i] [0]、$ rgb_array [$ i] [1]、$ rgb_array [$ i] [2]);
- // 3つの長方形を描画します。4番目(つまり、配列のゼロ要素)の色はデフォルトの画像の背景です
- ImageFilledRectangle($ im、0、0、25、25、$ color [1]);
- ImageFilledRectangle($ im、26、0、50、25、$ color [2]);
- ImageFilledRectangle($ im、0、25、25、50、$ color [3]);
- ImagePng($ im);
- imagedestroy($ im);
- }
- } else {
- exit();
- }
- } else {
- exit();
- }
*このソースコードは、 ソースコードハイライターで強調表示されました。
小規模の場合、つまり、招待状の有効性を確認する場合が依然として当てはまります。 これを行うには、画像の四隅の配列に色の値を読み込み、データベースで結果の配列のハッシュを見つけようとするだけで十分です。
- 関数validate_invite($ hash_serialize、$ userfile){
- //画像の読み込み時にエラーがなかった場合、画像のサイズは許容サイズを超えず、タイプは適切です
- if (isset($ userfile)&& is_uploaded_file($ userfile [ 'tmp_name' ])&& $ userfile [ 'size' ] <5 * 1024 && $ userfile [ 'type' ] == 'image / png' && $ userfile [ 'エラー ' ] == 0){
- //ロードされたものに基づいて画像を作成します
- $ source = ImageCreateFromPNG($ userfile [ 'tmp_name' ]);
- //色がチェックされるポイントを定義します
- $ x [] = 48; $ y [] = 48; $ x [] = 2; $ y [] = 2; $ x [] = 48; $ y [] = 2; $ x [] = 2; $ y [] = 48;
- $ rgb_array =配列();
- for ($ i = 0; $ i <4; ++ $ i){
- //ポイントでカラーインデックスを取得します
- $ color_index = imagecolorat($ソース、$ x [$ i]、$ y [$ i]);
- //インデックスの色を取得します
- $ color_tran = imagecolorsforindex($ソース、$ color_index);
- //配列に書き込みます
- $ rgb =配列();
- $ rgb [] = $ color_tran [ 'red' ];
- $ rgb [] = $ color_tran [ 'green' ];
- $ rgb [] = $ color_tran [ 'blue' ];
- $ rgb_array [] = $ rgb;
- }
- //配列内のレコードと照合するために、配列をバイトストリーム表現に変換します
- $ serialize_rgb_array = serialize($ rgb_array);
- //ハッシュを取得
- $ hash_serialize_rgb_array = md5($ serialize_rgb_array);
- //データベース内のエントリを探します
- $ _CORE [ 'db' ]-> query( 'SELECT `di_invite`.`invite_id` FROM` di_invite` WHERE` di_invite`.`invite_hash` = ?;' 、$ Hash_serialize_rgb_array);
- //見つかった場合、メモリをクリアしてtrueを返します。それ以外の場合、メモリをクリアしてfalseを返します
- if ($ _CORE [ 'db' ]-> num_rows()<1){
- imagedestroy($ソース);
- falseを 返し ます 。
- } else {
- imagedestroy($ソース);
- $ hash_serialize = $ hash_serialize_rgb_array;
- trueを 返し ます 。
- }
- } else falseを 返し ます 。
- }
*このソースコードは、 ソースコードハイライターで強調表示されました。
次のような結果になります。
PS画像を構築する際に、1つの不正確さが生じました。そのため、取得された画像は対称ではありません。