今日は子供の日です。PHP ウェブサイトの開発でよく使用される画像に透かしを追加する関数のソース コードを共有したいと思います。これは David によって作成され、個人テストに合格しました。画像とテキストの 2 つの方法で透かしを画像に追加します。画像は GIF、PNG、JPG の 3 つの形式をサポートします。透かし画像は PNG と GIF をサポートします。さっそく、私の PHP 画像透かし関数を投稿しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
|
function setWater($imgSrc,$markImg 、$markText、$TextColor、$markPos、$fontType,$markType)
{
$srcInfo
=
@getimagesize($imgSrc);
$srcImg_w =
$srcInfo[0];
$srcImg_h =
$srcInfo[1];
スイッチ
($srcInfo[2])
{
ケース
1:
$srcim
=imagecreatefromgif($imgSrc);
ブレイク;
ケース
2:
$srcim
=imagecreatefromjpeg($imgSrc);
ブレイク;
ケース
3:
$srcim
=imagecreatefrompng($imgSrc);
ブレイク;
デフォルト:
死ぬ("サポートされていない画像文ファイルの種類");
終了;
}
if(!strcmp($markType, "img"))
{
if(!file_exists($markImg)
空($markImg))
{
戻る;
}
$markImgInfo
=
@getimagesize($markImg);
$markImg_w =
$markImgInfo[0];
$markImg_h =
$markImgInfo[1];
if($srcImg_w
$markImg_w
$srcImg_h
$markImg_h)
{
戻る;
}
スイッチ
($markImgInfo[2])
{
ケース
1:
$markim
=imagecreatefromgif($markImg);
ブレイク;
ケース
2:
$markim
=imagecreatefromjpeg($markImg);
ブレイク;
ケース
3:
$markim
=imagecreatefrompng($markImg);
ブレイク;
デフォルト:
死ぬ("不支持の水印图片文件类型");
終了;
}
$logow
=
$markImg_w;
$ロゴ
=
$markImg_h;
}
if(!strcmp($markType, "テキスト"))
{ $fontSize
=
16;
if(!空($markText) )
{
if(!file_exists($fontType) )
{
戻る;
}
}
その他
{
戻る;
}
$ボックス
=
@imagettfbbox($fontSize,
0,
$fontType,$markText);
$logow
=
max($box[2],
$box[4])
-
分($box[0],
$box[6]);
$ロゴ
=
max($box[1],
$box[3])
-
分($box[5],
$box[7]);
}
if($markPos
==
0)
{
$markPos
=
rand(1,
9);
}
スイッチ($markPos)
{
ケース
1:
$x
=
+5; $y
=
+5;
ブレイク;
ケース
2:
$x
=
($srcImg_w
-
$logow)
/
2;
$y
=
+5;
ブレイク;
ケース
3:
$x
=
$srcImg_w
-
$logow
-
5;
$y
=
+15;
ブレイク;
ケース
4:
$x
=
+5;
$y
=
($srcImg_h
-
$logoh)
/
2;
ブレイク;
ケース
5:
$x
=
($srcImg_w
-
$logow)
/
2;
$y
=
($srcImg_h
-
$logoh)
/
2;
ブレイク;
ケース
6:
$x
=
$srcImg_w
-
$logow
-
5;
$y
=
($srcImg_h
-
$logoh)
/
2;
ブレイク;
ケース
7:
$x
=
+5; $y
=
$srcImg_h
-
$ロゴ
-
5;
ブレイク;
ケース
8:
$x
=
($srcImg_w
-
$logow)
/
2;
$y
=
$srcImg_h
-
$ロゴ
-
5;
ブレイク;
ケース
9:
$x
=
$srcImg_w
-
$logow
-
5;
$y
=
$srcImg_h
-
$ロゴ
-5;
ブレイク;
デフォルト:
死ぬ("この位置はサポートされていません");
終了;
}
$dst_img
=
@imagecreatetruecolor($srcImg_w,
$srcImg_h);
画像コピー (
$dst_img,
$srcim、
0,
0,
0,
0,
$srcImg_w、
$srcImg_h);
if(!strcmp($markType, "img"))
{
imagecopy($dst_img,
$markim、
$x、
$y、
0,
0,
$logow、
$logoh);
imagedestroy($markim);
}
if(!strcmp($markType, "テキスト"))
{
$rgb
=
爆発(',',
$TextColor);
$color
= imagecolorallocate($dst_img,
$rgb[0],
$rgb[1],
$rgb[2]);
imagettftext($dst_img,
$fontSize、
0,
$x、
$y、
$color、
$fontType,$markText);
}
スイッチ
($srcInfo[2])
{
ケース
1:
imagegif($dst_img,
$imgSrc);
ブレイク;
ケース
2:
imagejpeg($dst_img,
$imgSrc);
ブレイク;
ケース
3:
imagepng($dst_img,
$imgSrc);
ブレイク;
デフォルト:
死ぬ("不支持の水印图片文件类型");
終了;
}
imagedestroy($dst_img);
imagedestroy($srcim);
} |
パラメータの説明:
$imgSrc: ターゲット画像。相対ディレクトリ アドレスを持つことができます。
$markImg: 透かし画像。相対ディレクトリ アドレスを指定でき、PNG 形式と GIF 形式の両方をサポートします。たとえば、透かし画像が実行可能ファイルの mark ディレクトリにある場合は、mark/ のように記述できます。マーク.gif
$markText: 画像に追加された透かしテキスト
$TextColor: 透かしテキストのフォントの色
$markPos: 画像のウォーターマークを追加する位置、値の範囲: 0~9
0: ランダムな位置、1~8 の位置をランダムに選択します
1: 左上 2: 中央上 3: 右上 4: 左中央
5: 写真の中央 6: 右の中央 7: 下の中央 8: 下の中央 9: 下の中央
$fontType: 相対ディレクトリ アドレスを持つことができる特定のフォント ライブラリ
$markType: 画像に透かしを追加する方法。img は画像として透かしを追加することを意味し、text は透かしをテキストとして追加することを意味します
コードコメント:
4~6行目: 対象画像の幅と高さを取得します
8~22行目:画像の種類に応じて関数を呼び出して操作画像の識別子を取得します
GetImageSize 関数の知識ポイント: GetImageSize は GD をインストールせずに使用でき、戻り値の配列には 4 つの要素があります。インデックス値 0 は画像の高さです。インデックス値 1 は画像の幅です。インデックス値 2 は画像のファイル形式で、値 1 は GIF 形式、2 は JPEG/JPG 形式、3 は PNG 形式です。インデックス値 3 は、画像の高さと幅の文字列、高さ=xxx 幅=yyy です。返される画像の幅と高さの単位はピクセルです
24 ~ 58 行目: 対象画像に透かしを追加する画像方法を選択する際に、透かし画像 (通常は Web サイトのロゴ) の幅と高さを取得します。対象画像の幅や高さが透かし画像よりも小さい場合、または透かし画像が存在しない場合、この機能は飛び出します。
Return ステートメントの知識ポイント: 直接リターンとは、何も返さずに関数を直接終了することを意味します。 NULL を返すとも解釈できます。
行 60 ~ 77: ターゲット画像にウォーターマークを追加するテキスト方法を選択するとき、最初にウォーターマークのテキストのサイズを設定します。デフォルトでは、フォント サイズを 16px に設定します。フォント ファイルが存在しない場合は、関数を抜けて、最後に imagettfbbox 関数を使用してこの形式のテキストの仮想長さと幅を取得します。
Imagettfbbox 関数の知識ポイント: この関数は、テキスト フレームの 4 隅を表す 8 つのセルを含む配列を返します。インデックス値の意味: 0 は左下隅の X 位置を表します。 1 は座り角の Y 位置、2 は右下角の X 位置、3 は右下角の Y 位置、4 は右上角の X 位置、5 は座り角の Y 位置を表します。 6は左上隅のX位置を表し、7は左上隅のY位置を表します。 この関数には、GD ライブラリと FreeType ライブラリの両方のサポートが必要です
max 関数 はパラメータの中で最大の値を返します。
79~125行目:設定した画像の透かし位置に基づいて特定の座標値を計算します。効果に応じて透かし位置を調整できます。
127~129行目:対象画像と同じサイズで新規画像を作成します。
注意: imagecreatetruecolor 関数の範囲は黒の画像であるため、ターゲット画像が透明な場合、生成される新しい画像は透明になりません。
131~162行目:画像やテキストを元に、最終的にウォーターマークを追加した画像を生成します。
呼び出し手順:
関数呼び出しで呼び出すこともできます。もちろん、クラスにカプセル化することも、必要に応じてこの関数をさらにモジュールに分割することもできます。もちろん、今このまま使っても問題ありませんので、安心して使ってください。
その他の指示:
imagettftext 関数と imagettfbbox 関数は GD ライブラリと FreeType ライブラリのサポートを必要とするため、動作環境が GD ライブラリと FreeType ライブラリをサポートしていない場合は、imagestring 関数を使用してテキスト モードを実装できません。画像にテキストの透かしを追加し、テキスト モードで $logow と $logoh の値を設定するだけです。
imagejpeg関数では合成画像の画質も設定できます。
PHP 画像透かし機能のアイデアのまとめ:
まず、ターゲット画像、透かし画像、テキストの幅と高さを計算し、次に特定の位置に基づいて最終的な透かしが表示される位置情報、つまり X 値と Y 値を計算します。最後に、写真が結合され、新しい写真に透かしが追加されます。
注: PHP Web サイト開発チュートリアル-leapsoul.cn 転載の際は、元のソースとこの記述をリンクの形式で明記してください。