午後は何もすることがなかったので、画像に透かしを追加するためのクラスを書きました。このクラスは、画像へのテキスト透かしの追加、画像透かしの追加を実装し、すべてのネチズンが学習してコミュニケーションできるようにする透明機能も実装します。
/**
* 透かしカテゴリを追加し、テキスト、画像の透かしと透明度の設定を追加し、透かし画像の背景が透明になります。
* @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.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/478502.html
技術記事