ホームページ  >  記事  >  バックエンド開発  >  画像にウォーターマークを追加するための超強力なクラス_PHP チュートリアル

画像にウォーターマークを追加するための超強力なクラス_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:47:21918ブラウズ

午後は何もすることがなかったので、画像に透かしを追加するためのクラスを書きました。このクラスは、画像へのテキスト透かしの追加、画像透かしの追加を実装し、すべてのネチズンが学習してコミュニケーションできるようにする透明機能も実装します。

/**

* 透かしカテゴリを追加し、テキスト、画像の透かしと透明度の設定を追加し、透かし画像の背景が透明になります。

* @author litx 日付:2011 年 12 月 5 日午後 3 時、マイクロン クイックキャスト R&D センターにて

​*/

ウォーターマスククラス

{

/**

* 透かしタイプ

* @var int $waterType 0 はテキストの透かし、1 は画像の透かしです

​​*/

プライベート $waterType = 1;

/**

* 透かし位置の種類

* @var int $pos デフォルトは 9 (右下隅) です

​​*/

プライベート $pos = 9;

/**

*透かしの透明度

* @var int $transparent ウォーターマークの透明度 (値が小さいほど透明度が高くなります)

​​*/

プライベート $transparent = 20;

/**

* テキスト透かしの場合は、透かしテキストを追加する必要があります

* @var string $waterStr デフォルト値 (Li Tiexiong の個人コレクション)

​​*/

private $waterStr = '個人のポートフォリオ';

/**

* テキストのフォントサイズ

* @var int $fontSize フォントサイズ

​​*/

プライベート $fontSize = 14;

/**

* 透かしの文字色 (RGB)

* @var 配列 $fontColor 透かしのテキストの色 (RGB)

​​*/

プライベート $fontColor = 配列 (255, 255, 255);

/**

* フォントファイル

* @var 不明なタイプ

​​*/

プライベート $fontFile = 'AHGBold.ttf';

/**

*透かし画像

* @var 文字列 $waterImg

​​*/

プライベート $waterImg = 'ロゴ.png';

/**

* 透かしを入れる必要がある画像

* @var 文字列 $srcImg

​​*/

プライベート $srcImg = '';

/**

*画像ハンドル

* @var 文字列 $im

​​*/

プライベート $im = '';

/**

* 透かし画像ハンドル

* @var 文字列 $water_im

​​*/

プライベート $water_im = '';

/**

※画像情報

* @var 配列 $srcImg_info

​​*/

プライベート $srcImg_info = '';

/**

*透かし画像情報

* @var 配列 $waterImg_info

​​*/

プライベート $waterImg_info = '';

/**

* 透かしの文字幅

* @var int $str_w

​​*/

プライベート $str_w = '';

/**

* 透かしのテキストの高さ

* @var int $str_h

​​*/

プライベート $str_h = '';

/**

*透かしXコーディネート

* * @var int $x

​​*/

プライベート $x = '';

/**

*透かしy座標

* @var int $y

​​*/

プライベート $y = '';

/**

* コンストラクター、透かしを入れる必要があるソース画像を渡してソース画像を初期化します

* @param string $img 透かしを入れる必要があるソース画像

​​*/

パブリック関数 __construct ($img)

{

If(file_exists($img)){//ソースファイルが存在します

$this -> srcImg = $img;

}else{//ソース ファイルが存在しません

echo 'ソースファイル'.$img.' が存在しません。ファイルパスが正しいかどうかを確認してください

;

終了();

}

}

/**

* 透かしを入れる必要がある画像の情報を取得し、画像をロードします

​​*/

パブリック関数 imginfo ()

                                                    

$this -> srcImg_info = getimagesize($this -> srcImg); var_dump($this -> srcImg_info);exit();

スイッチ ($this -> srcImg_info[2]) {

ケース 3 ://png

$ this - >

休憩 1;

ケース 2: // jpeg/jpg

                                                                                                                                                                     

休憩 1;

ケース 1: //gif

$ this->

休憩 1;

デフォルト:

Echo 'ソース画像ファイル'. $ This -& gt; '現在、この機能は PNG、JPEG、GIF 画像の透かし機能のみをサポートしています。

終了();

}

}

/**

* ウォーターマーク画像の情報を取得して画像を読み込みます

​​*/

プライベート関数 Waterimginfo ()

{

$this ->waterImg_info = getimagesize($this ->waterImg);

switch ($this ->waterImg_info[2]) {

ケース 3:

​​ ​ ​ ​ ​ ​​

休憩 1;

ケース 2:

​​ ​ ​ ​ ​ ​ ​​

休憩 1;

ケース 1 :

​​ ​ ​ ​ ​ ​​

休憩 1;

デフォルト:

Echo 'ソース画像ファイル' $ This -& gt; '現時点では、この機能は PNG、JPEG、GIF 画像の透かし機能のみをサポートしています。

終了();

}

}

/**

* 透かし位置アルゴリズム

​​*/

プライベート関数ウォーターポス ()

{

switch ($this -> pos) {

case 0: //ランダムな位置

$this -> x = rand(0, $this ->gt; srcImg_info[0] - $this ->waterImg_info[0]);

$this -> y = rand(0, $this ->gt; srcImg_info[1] - $this ->waterImg_info[1]);

休憩 1;

ケース 1: //左上

$this -> x = 20;

$this -> y = 20;

休憩 1;

ケース 2: //上中央

$this -> x = ($this ->gt; srcImg_info[0] - $this ->waterImg_info[0]) / 2;

$this -> y = 20;

休憩 1;

ケース 3: //右上

​​​​​​​​​​​​​

$this -> y = 20;

休憩 1;

ケース 4: //中央左

$this -> x = 20;

$this -> y = ($this ->gt; srcImg_info[1] - $this ->waterImg_info[1]) / 2;

休憩 1;

case 5: //中中

$this -> x = ($this ->gt; srcImg_info[0] - $this ->waterImg_info[0]) / 2;

                $this -> y = ($this ->srcImg_info[1] - $this ->waterImg_info[1]) / 2; 

                休憩1; 

            ケース 6 : //中右

                $this -> x = $this -> srcImg_info[0] - $this ->水Img_info[0] - 20; 

                $this -> y = ($this ->srcImg_info[1] - $this ->waterImg_info[1]) / 2; 

                休憩1; 

            ケース 7 : //下左

                $this -> x = 20; 

                $this -> y = $this -> srcImg_info[1] - $this ->水Img_info[1] - 20; 

                休憩1; 

            ケース 8 : //下中 www.2cto.com

                $this -> x = ($this ->srcImg_info[0] - $this ->waterImg_info[0]) / 2; 

                $this -> y = $this -> srcImg_info[1] - $this ->水Img_info[1] - 20; 

                休憩1; 

            ケース 9 : //下右

                $this -> x = $this -> srcImg_info[0] - $this ->水Img_info[0] - 20; 

                $this -> y = $this -> srcImg_info[1] - $this ->水Img_info[1] - 20; 

                休憩1; 

            デフォルト : //下右

                $this -> x = $this -> srcImg_info[0] - $this ->水Img_info[0] - 20; 

                $this -> y = $this -> srcImg_info[1] - $this ->水Img_info[1] - 20; 

                休憩1; 

        }

    }

    /**

* 画像の透かしを追加します

​​*/

    プライベート関数 Waterimg ()

    {

        if ($this -> srcImg_info[0] <= $this ->waterImg_info[0] || $this -> srcImg_info[1] <= $this ->waterImg_info[1]) {

            echo '图片尺寸太小、無法加水印、请上传一张大图片'; 

            出口(); 

        }

        //计算水印の位置

        $this->waterpos(); 

        $cut = imagecreatetruecolor($this ->waterImg_info[0], $this ->waterImg_info[1]); 

        imagecopy($cut, $this ->im, 0, 0, $this ->x, $this ->y, $this ->waterImg_info[0],

        $this -> WaterImg_info[1]); 

        $pct = $this ->透明; 

        imagecopy($cut, $this ->water_im, 0, 0, 0, 0, $this ->waterImg_info[0],

        $this -> WaterImg_info[1]); 

        // 画像と水印の画像を合成します

        imagecopymerge($this ->im, $cut, $this ->x, $this ->y, 0, 0, $this ->waterImg_info[0], $this ->waterImg_info[1], $pct); 

    }

    /**

* テキストの透かしを追加します

​​*/

    プライベート関数 Waterstr ()

    {

        $rect = imagettfbbox($this ->fontSize, 0, $this ->fontFile, $this ->waterStr); 

        $w = abs($rect[2] - $rect[6]); 

        $h = abs($rect[3] - $rect[7]); 

        $fontHeight = $this ->フォントサイズ; 

        $this -> Water_im = imagecreatetruecolor($w, $h); 

        imagealphablending($this ->water_im, false); 

        Imagesavealpha($this ->water_im, true); 

        $white_alpha = imagecolorallocatealpha($this ->water_im, 255, 255, 255, 127); 

        imagefill($this ->water_im, 0, 0, $white_alpha); 

        $color = imagecolorallocate($this ->water_im, $this ->gt; fontColor[0], $this ->gt; fontColor[1],

        $this -> fontColor[2]); 

        imagettftext($this ->water_im, $this ->fontSize, 0, 0, $this ->fontSize, $color,

        $this -> fontFile、$this ->水Str); 

        $this -> WaterImg_info = 配列 (

            0 => $w, 1 => $h

        ); 

        $this->waterimg(); 

    }

    /**

* 透かし画像出力

​​*/

    パブリック関数の出力 ()

    {

        $this->imginfo(); 

        if ($this ->waterType == 0) {

            $this->waterstr(); 

        } その他 {

            $this->waterimginfo(); 

            $this->waterimg(); 

        }

        スイッチ ($this -> srcImg_info[2]) {

            ケース 3 :

                imagepng($this ->im, $this ->srcImg); 

                休憩1; 

            ケース 2 :

                imagejpeg($this ->im, $this ->srcImg); 

                休憩1; 

            ケース 1 :

                imagegif($this ->im, $this ->srcImg); 

                休憩1; 

            デフォルト:

die('ウォーターマークの追加に失敗しました!');

壊す;

}

//画像合成後の破棄処理

imagedestroy($this ->

);

imagedestroy($this ->water_im);

}

}

使用例:

// オブジェクトをインスタンス化します

$obj = 新しいウォーターマスク('img/10451.jpg');

//タイプ: 0 はテキストの透かし、1 は画像の透かしです

$obj->waterType = 0;

//透かしの透明度、値が小さいほど透明度が高くなります

$obj->透明 = 15;

//透かしテキスト

//$obj->waterStr = 'お誕生日おめでとう';

//透かし画像

//$obj->waterImg = '';//透かし画像

//テキストのフォントサイズ

$obj->fontSize = 14;

//透かしのテキストの色 (RGB)

$obj->fontColor = array(255,255,100);

//フォントファイル

$obj->fontFile = 'STCAIYUN.ttf';

//出力ウォーターマーク画像ファイルは入力画像ファイルを上書きします

$obj->output();

使用方法は比較的簡単で非常に実用的です。

著者 ltx851201

http://www.bkjia.com/PHPjc/478502.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/478502.html

技術記事

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