PHP gd ライブラリのウォーターマーク クラスが 7 年後にリファクタリングされ、php7 をサポート
<?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 チュートリアルに興味のある友人の参考になれば幸いです。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









多くのユーザーはスマートウォッチを選ぶときにファーウェイブランドを選択しますが、その中でもファーウェイ 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 の使い方は、 1. 戻り値の型が void の関数については、return 文を使用して関数の実行を早期に終了することができます; 2. 戻り値の型が void ではない関数については、 return ステートメントは、関数の実行を終了するためのものです。結果は呼び出し元に返されます。 3. 関数の実行を早期に終了します。関数内で return ステートメントを使用して、関数の実行を早期に終了することもできます。関数が値を返さない場合。

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

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

Windows 11 で Snipping Tool が機能しない理由 問題の根本原因を理解すると、適切な解決策を見つけるのに役立ちます。 Snipping Tool が正しく動作しない主な理由は次のとおりです。 フォーカス アシスタントがオンになっている: これにより、Snipping Tool が開かなくなります。破損したアプリケーション: 起動時にスニッピング ツールがクラッシュする場合は、破損している可能性があります。古いグラフィック ドライバー: 互換性のないドライバーは、スニッピング ツールに干渉する可能性があります。他のアプリケーションからの干渉: 実行中の他のアプリケーションが Snipping Tool と競合する可能性があります。証明書の有効期限が切れています: アップグレード プロセス中のエラーにより、この問題が発生する可能性があります。これらの簡単な解決策は、ほとんどのユーザーに適しており、特別な技術知識は必要ありません。 1. Windows および Microsoft Store アプリを更新する
![Windows 11/10でプロセッサーのサーマルトリップエラーを修正する方法[修正]](https://img.php.cn/upload/article/000/000/164/168169038621890.png?x-oss-process=image/resize,m_fill,h_207,w_330)
ラップトップやデスクトップなどのデバイスのほとんどは、若いゲーマーやプログラマーによって長年にわたって頻繁に使用されてきました。アプリケーションの過負荷により、システムがハングすることがあります。これにより、ユーザーはシステムを強制的にシャットダウンする必要があります。これは主に、重いゲームをインストールしてプレイするプレイヤーに発生します。強制シャットダウン後にシステムが起動しようとすると、以下に示すような黒い画面でエラーがスローされます。 以下は、この起動中に検出された警告です。これらは、イベント ログ ページの設定で表示できます。警告: プロセッサーの温度トリップ。何かキーを押すと続行します。 ..これらのタイプの警告メッセージは、デスクトップまたはラップトップのプロセッサ温度がしきい値温度を超えると常にスローされます。 Windows システムでこの問題が発生する理由を以下に示します。重いアプリケーションがたくさんあります
![内部エラー: 一時ディレクトリを作成できません [解決済み]](https://img.php.cn/upload/article/000/000/164/168171504798267.png?x-oss-process=image/resize,m_fill,h_207,w_330)
Windows システムでは、ユーザーは実行可能ファイル/セットアップ ファイルを使用してさまざまな種類のアプリケーションをシステムにインストールできます。最近、多くの Windows ユーザーが、実行可能ファイルを使用してアプリケーションをインストールしようとすると、システム上で INTERNALERROR:cannotCreateTemporaryDirectory というエラーが表示されると苦情を言い始めています。この問題はこれに限定されず、Windows システムにインストールされている既存のアプリケーションをユーザーが起動することもできなくなります。考えられる理由のいくつかを以下に示します。管理者権限を付与せずに実行可能ファイルを実行してインストールします。 TMP 変数に無効なパス、または異なるパスが指定されました。破損したシステム

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