ホームページ  >  記事  >  php教程  >  PHP画像透かし機能:画像やテキストへの透かし追加をサポート

PHP画像透かし機能:画像やテキストへの透かし追加をサポート

WBOY
WBOYオリジナル
2016-06-21 08:53:381383ブラウズ

今日は子供の日です。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 転載の際は、元のソースとこの記述をリンクの形式で明記してください。



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。