ホームページ バックエンド開発 PHPチュートリアル PHP gd ライブラリのウォーターマーク クラスが 7 年後にリファクタリングされ、php7 をサポート

PHP gd ライブラリのウォーターマーク クラスが 7 年後にリファクタリングされ、php7 をサポート

Jul 29, 2016 am 09:05 AM
gt quot return temp this

<?php
/**
 * 缩略图水印生成类 文字水印 字符编码为 utf-8 
 * 中文需要处理还字体的问题
 * @name    MakeMiniature
 * @see  
 * @version	2.1.0 (2016-1-22)
 * @author	sanshi0815
 */
class MakeMiniature
{
	//字体带目录
	private $font;
	//水印内容 可以是 文字,可以是图片路径,也可以为为空
	private $watermark;
	//源文件
	private $srcFile;
	//目标文件
	private $dstFile;
	//水印类别 0 无水印,1图片水印,2文字水印
	private $watetType;
	//支持的图片类别当前支持2种
	private $imgType=array("jpg","jpeg","png");
	//图片打开资源句柄
	private $im;
	//原始图片类型
	private $fileType;
	private $errorMsg="";
	public function __construct()
	{

	}
	/**
	* 获取失败信息
	* @author  sanshi0815
	* @return  		string	失败信息
	*/
	public function getErrorMsg()
	{
		return $this->errorMsg;
	}
	/**
	* 参数设置
	* @author  sanshi0815
	* @param 		string		$font	字体文件带目录文字水印使用
	* @param 		string		$watermark	水印文字或者是图片地址
	* @param 		string		$srcFile	原始图片地址
	* @param 		string		$dstFile	生成新图片地址
	* @return  		null					无返回值
	*/
	public function set($font,$watermark,$srcFile,$dstFile)
	{
		$this->font = $font;
		$this->watermark = $watermark;
		$this->srcFile = $srcFile;
		$this->dstFile = $dstFile;
		if(empty($this->watermark ))
		{
			//无水印
			$this->watetType = 0;
		}elseif(is_file($this->watermark)){
			//图片水印
			$this->watetType = 1;
		}else{
			//文字水印
			$this->watetType = 2;
		}
	}
	/**
	* 图片资源获取 成功返回数组,失败返回false
	* @author  sanshi0815
	* @param 		string		$fileName	图片地址
	* @return  		array		r{句柄},t{后缀},w{宽度},h{高度}
	*/
	private function getResource($fileName)
	{
		if(!is_file($fileName))
		{
			$this->errorMsg = "{$fileName}  不存在 line:".__LINE__;
		}
		$temp = explode('.',$fileName);
		$fileType = strtolower(end($temp));
		//判断后缀是否是否符合要求
		if(!in_array($fileType,$this->imgType))
		{
			//文件类型不支持
			$this->errorMsg = "{$fileName}图片后缀类型不支持 line:".__LINE__;
			return false;
		}
		if($fileType=="jpg" || $fileType=="jpeg")
		{
			$im=imageCreateFromjpeg($fileName);
		}else{
			$im=imagecreatefrompng($fileName);
		}
		if(!$im)
		{
			//图片初始化失败
			$this->errorMsg = "{$fileName}图片初始化资源失败 line:".__LINE__;
			return false;
		}
		//源图片宽
		$width=imagesx($im);
		//源图片高
		$height=imagesy($im);
		if(empty($width) || empty($height))
		{
			//图片高度宽度获取失败
			$this->errorMsg = "{$fileName}图片高度或者宽度获取失败 line:".__LINE__;
			return false;
		}
		return array("r"=>$im,"t"=>$fileType,"w"=>$width,"h"=>$height);
	}
	/**
	* 原始图片全局变量设置 成功返回数组,失败返回false 
	* @author  sanshi0815
	* @return  	array		w{宽度},h{高度}
	*/
	private function initSrcImgWH()
	{
		$temp = $this->getResource($this->srcFile);
		if(empty($temp)) 
		{
			$this->errorMsg = "图像资源不存在 line:".__LINE__;
			return false;
		}
		$this->fileType = $temp['t'];
		$this->im=$temp['r'];
		return array("w"=>$temp['w'],"h"=>$temp['h']);
	}
	/**
	* 固定宽度,高度 进行图片缩放
	* @author  sanshi0815
	* @param 		int		$width	生成图片宽度
	* @param 		int		$height	生成图片高度
	* @return  	bool		成功为 true,失败为false
	*/
	public function resetImgWH($width,$height)
	{
		$temp = $this->initSrcImgWH();
		if(empty($temp))
		{
			$this->errorMsg = "图像资源不存在 line:".__LINE__;
			return false;
		}
		$srcW = $temp['w'];
		$srcH = $temp['h'];
		$detW = intval($width);
		$detH = intval($height);
		//生成新的图像资源
		$om = $this->getNewImg($srcW,$srcH,$detW,$detH);
		$temp = empty($om) ? false : $this->createImg($om,$detW,$detH);
		return $temp;
	}
	/**
	* 根据最大高度 进行图片等比缩放
	* @author  sanshi0815
	* @param 		int		$maxHeight	生成图片高度
	* @return  	bool		成功为 true,失败为false
	*/
	public function resetImgMaxH($maxHeight)
	{
		$maxHeight = intval($maxHeight);
		$temp = $this->initSrcImgWH();
		if(empty($temp))
		{
			$this->errorMsg = "图像资源不存在 line:".__LINE__;
			return false;
		}
		$srcW = $temp['w'];
		$srcH = $temp['h'];
		//计算缩放比
		$scale = round($maxHeight/$srcH,4);
		$detW = round($srcW*$scale);
		$detH = round($srcH*$scale);
		//生成新的图像资源
		$om = $this->getNewImg($srcW,$srcH,$detW,$detH);
		$temp = empty($om) ? false : $this->createImg($om,$detW,$detH);
		return $temp;

	}
	/**
	* 根据最大宽度 进行图片等比缩放
	* @author  sanshi0815
	* @param 		int		$maxWidth	生成图片宽度
	* @return  	bool		成功为 true,失败为false
	*/
	public function resetImgMaxW($maxWidth)
	{
		$temp = $this->initSrcImgWH();
		if(empty($temp))
		{
			$this->errorMsg = "图像资源不存在 line:".__LINE__;
			return false;
		}
		$srcW = $temp['w'];
		$srcH = $temp['h'];
		//计算缩放比
		$scale = round($maxWidth/$srcW,4);
		$detW = round($srcW*$scale);
		$detH = round($srcH*$scale);
		//生成新的图像资源
		$om = $this->getNewImg($srcW,$srcH,$detW,$detH);
		//$om = $this->im;
		$temp = empty($om) ? false : $this->createImg($om,$detW,$detH);
		return $temp;

	}
	/**
	* 获得缩放后的图片资源句柄
	* @author  sanshi0815
	* @param 		int		$srcW	原始图片宽度
	* @param 		int		$srcH	原始图片高度
	* @param 		int		$detW	原始图片宽度
	* @param 		int		$detH	原始图片高度
	* @return  	bool		成功为 true,失败为false
	*/
	private function getNewImg($srcW,$srcH,$detW,$detH)
	{
		$om=imagecreatetruecolor($detW,$detH);//真色彩对gb库有要求
		if(empty($om))
		{
			$this->errorMsg = "imagecreatetruecolor 函数失败 line:".__LINE__;
			return false;
		}
		//ImageCopyResized($om,$im,0,0,0,0,$detW,$detH,$srcW,$srcH);
		$temp = imagecopyresampled($om,$this->im,0,0,0,0,$detW,$detH,$srcW,$srcH);
		if(empty($temp))
		{
			$this->errorMsg = "imagecopyresampled 函数失败 line:".__LINE__;
			return false;
		}
		return $om;
	}
	/**
	* 获得图片加文字水印后资源
	* @author  sanshi0815
	* @param 		resource		$im  	原始资源
	* @param 		int		$detW	原始图片宽度
	* @param 		int		$detH	原始图片高度
	* @return  	resource		成功为 水印后的图片资源,失败为false
	*/
	private function getWatermarkText($im,$detW,$detH)
	{
		if(!$is_file($this->font))
		{
			$this->errorMsg = "{$this->font} 字体不存在 line:".__LINE__;
			return false;
		}
		//旋转角度
		$angle = 20; 
		$width = $detW/10;
		$size =  $detW/8;
		$height = $detH;
		//echo $height;
		$black = imagecolorallocate($im, 0, 0, 0);
		$grey = imagecolorallocate($im, 180, 180, 180);
		//生成水印次数
		$formax = 3;
		for($i=$formax;$i>=1;$i--)
		{
			$height =$height-$detH/($formax+2);
			//echo $height."<br/>";
			$temp = imagettftext($im, $size, $angle,$width,$height, $grey, $this->font,$this->watermark);
			if(empty($temp))
			{
				$this->errorMsg = "imagettftext 函数失败 line:".__LINE__;
				return false;
			}
		}
		return $im;
	}
	/**
	* 获得图片加图片水印后资源
	* @author  sanshi0815
	* @param 		resource		$im  	原始资源
	* @param 		int		$detW	原始图片宽度
	* @param 		int		$detH	原始图片高度
	* @return  	resource		成功为 水印后的图片资源,失败为false
	*/
	private function getWatermarkPic($im,$detW,$detH)
	{
		$temp = $this->getResource($this->watermark);
		if(empty($temp)) return false;
		$wm = $temp['r'];
		$src_x = 0;
		$src_y =  0;
		$src_w = $temp['w'];
		$src_h = $temp['h'];
		$dst_x = $detW;
		$dst_y = $detH;
		$height = $dst_y > $src_h ? ($dst_y - $src_h)/2 :0;
		$width =  $dst_x > $src_w ? ($dst_x - $src_w)/2 : 0;
		$temp = imagealphablending($im,true);
		if(empty($temp))
		{
			$this->errorMsg = "imagealphablending 函数失败 line:".__LINE__;
			return false;
		}
		$temp = imagecopymerge($im,$wm,$width,$height,0,0,$src_w,$src_h,70);
		if(empty($temp))
		{
			$this->errorMsg = "imagecopymerge 函数失败 line:".__LINE__;
			return false;
		}
		return $im;
	}
	/**
	* 新图片生成
	* @author  sanshi0815
	* @param 		resource		$im  	原始资源
	* @param 		int		$detW	原始图片宽度
	* @param 		int		$detH	原始图片高度
	* @return  		bool		成功为true,失败为false
	*/
	private function createImg($im,$detW,$detH)
	{
		//处理水印
		if($this->watetType==2)
		{
			$om = $this->getWatermarkText($im,$detW,$detH);
		}elseif ($this->watetType==1) {
			$om = $this->getWatermarkPic($im,$detW,$detH);
		}else{
			$om = $im;
		}
		if(empty($om))
		{
			$this->errorMsg = "图片资源不存在 line:".__LINE__;
			return false;
		}
		$fileType = $this->fileType;
		if($fileType=="jpg" || $fileType=="jpeg")
		{
			$temp=imagejpeg($om,$this->dstFile);
		}else{
			$temp=imagepng($om,$this->dstFile);
		}
		return $temp;
	}
}

$file=new MakeMiniature();
$file->set("./simhei.ttf","张磊专用","1_1453362028.png","s1_1453362028.png");
$file->resetImgMaxW(800);

?>
ログイン後にコピー

昔、ウォーターマーククラスについて書いていたのを思い出しました。 あまりにも長くなりすぎて、使いにくいものや、サムネイルなどの場面が変わってしまったものもあります。それらの多くは最大値に基づく必要があります。幅または高さは固定比率ではなく生成されます。これは、この方法で作成された画像が最高の表示効果を持ち、変形しないためです。したがって、このクラスは php7 のサポートのために再度改良され、実際には古いクラスもサポートされます。

前のクラス http://blog.csdn.net/sanshi0815/article/details/1604905

以上、PHP 7 をサポートするために 7 年ぶりに再構築された PHP gd ライブラリのウォーターマーク クラスについて、いくつかの側面を含めて紹介しましたが、PHP チュートリアルに興味のある友人の参考になれば幸いです。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Huawei GT3 ProとGT4の違いは何ですか? Huawei GT3 ProとGT4の違いは何ですか? Dec 29, 2023 pm 02:27 PM

多くのユーザーはスマートウォッチを選ぶときにファーウェイブランドを選択しますが、その中でもファーウェイ GT3pro と GT4 は非常に人気のある選択肢であり、多くのユーザーはファーウェイ GT3pro と GT4 の違いに興味を持っています。 Huawei GT3pro と GT4 の違いは何ですか? 1. 外観 GT4: 46mm と 41mm、材質はガラスミラー + ステンレススチールボディ + 高解像度ファイバーバックシェルです。 GT3pro: 46.6mm および 42.9mm、材質はサファイアガラス + チタンボディ/セラミックボディ + セラミックバックシェルです。 2. 健全な GT4: 最新の Huawei Truseen5.5+ アルゴリズムを使用すると、結果はより正確になります。 GT3pro: ECG 心電図と血管と安全性を追加

C言語のreturnの使い方を詳しく解説 C言語のreturnの使い方を詳しく解説 Oct 07, 2023 am 10:58 AM

C 言語における return の使い方は、 1. 戻り値の型が void の関数については、return 文を使用して関数の実行を早期に終了することができます; 2. 戻り値の型が void ではない関数については、 return ステートメントは、関数の実行を終了するためのものです。結果は呼び出し元に返されます。 3. 関数の実行を早期に終了します。関数内で return ステートメントを使用して、関数の実行を早期に終了することもできます。関数が値を返さない場合。

Win7の一時ファイルの場所を変更する方法を教えます Win7の一時ファイルの場所を変更する方法を教えます Jan 04, 2024 pm 11:25 PM

temp フォルダは一時ファイルの保存場所です。システムは一時ファイルをこのフォルダに保存します。一時ファイルが多すぎる場合、特に一時フォルダがシステム ディスク上にある場合は、システムの動作速度に影響を与える可能性があります。テンポラリの場所を変更することで問題を解決できるので、以下を見てみましょう。 win7temp の場所を変更するチュートリアル 1. まず、「コンピューター」を右クリックし、「プロパティ」を開きます。 2. 左側の「システムの詳細設定」をクリックします。 3. 下の「環境変数」をクリックします。 4. 「temp」を選択し、「」をクリックします。 「編集」 5. そして変更 「変数値」を変更が必要なパスに変更するだけです。

Javaのreturn文とfinally文の実行順序は何ですか? Javaのreturn文とfinally文の実行順序は何ですか? Apr 25, 2023 pm 07:55 PM

ソースコード: publicclassReturnFinallyDemo{publicstaticvoidmain(String[]args){System.out.println(case1());}publicstaticintcase1(){intx;try{x=1;returnx;}finally{x=3;}}}#出力 上記のコードの出力は、単純に次のように結論付けることができます:finally の前に return が実行されます。バイトコード レベルで何が起こるかを見てみましょう。以下は、case1 メソッドのバイトコードの一部をインターセプトし、ソース コードを比較して、各命令の意味に注釈を付けます。

修正: Windows 11 で Snipping ツールが機能しない 修正: Windows 11 で Snipping ツールが機能しない Aug 24, 2023 am 09:48 AM

Windows 11 で Snipping Tool が機能しない理由 問題の根本原因を理解すると、適切な解決策を見つけるのに役立ちます。 Snipping Tool が正しく動作しない主な理由は次のとおりです。 フォーカス アシスタントがオンになっている: これにより、Snipping Tool が開かなくなります。破損したアプリケーション: 起動時にスニッピング ツールがクラッシュする場合は、破損している可能性があります。古いグラフィック ドライバー: 互換性のないドライバーは、スニッピング ツールに干渉する可能性があります。他のアプリケーションからの干渉: 実行中の他のアプリケーションが Snipping Tool と競合する可能性があります。証明書の有効期限が切れています: アップグレード プロセス中のエラーにより、この問題が発生する可能性があります。これらの簡単な解決策は、ほとんどのユーザーに適しており、特別な技術知識は必要ありません。 1. Windows および Microsoft Store アプリを更新する

Windows 11/10でプロセッサーのサーマルトリップエラーを修正する方法[修正] Windows 11/10でプロセッサーのサーマルトリップエラーを修正する方法[修正] Apr 17, 2023 am 08:13 AM

ラップトップやデスクトップなどのデバイスのほとんどは、若いゲーマーやプログラマーによって長年にわたって頻繁に使用されてきました。アプリケーションの過負荷により、システムがハングすることがあります。これにより、ユーザーはシステムを強制的にシャットダウンする必要があります。これは主に、重いゲームをインストールしてプレイするプレイヤーに発生します。強制シャットダウン後にシステムが起動しようとすると、以下に示すような黒い画面でエラーがスローされます。 以下は、この起動中に検出された警告です。これらは、イベント ログ ページの設定で表示できます。警告: プロセッサーの温度トリップ。何かキーを押すと続行します。 ..これらのタイプの警告メッセージは、デスクトップまたはラップトップのプロセッサ温度がしきい値温度を超えると常にスローされます。 Windows システムでこの問題が発生する理由を以下に示します。重いアプリケーションがたくさんあります

内部エラー: 一時ディレクトリを作成できません [解決済み] 内部エラー: 一時ディレクトリを作成できません [解決済み] Apr 17, 2023 pm 03:04 PM

Windows システムでは、ユーザーは実行可能ファイル/セットアップ ファイルを使用してさまざまな種類のアプリケーションをシステムにインストールできます。最近、多くの Windows ユーザーが、実行可能ファイルを使用してアプリケーションをインストールしようとすると、システム上で INTERNALERROR:cannotCreateTemporaryDirectory というエラーが表示されると苦情を言い始めています。この問題はこれに限定されず、Windows システムにインストールされている既存のアプリケーションをユーザーが起動することもできなくなります。考えられる理由のいくつかを以下に示します。管理者権限を付与せずに実行可能ファイルを実行してインストールします。 TMP 変数に無効なパス、または異なるパスが指定されました。破損したシステム

tempファイルとは何ですか? tempファイルとは何ですか? Jan 05, 2021 am 10:43 AM

temp は一時フォルダーです。パス「C:\Documents and Settings\Administrator\Local Settings\」には、お気に入り、Web ページの閲覧、ファイル編集用の一時ファイルなど、多くの一時ファイルがここに配置されます。

See all articles