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
위 내용은 PHP7을 지원하기 위해 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
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











많은 사용자들이 스마트 시계를 선택할 때 Huawei 브랜드를 선택하게 됩니다. 그 중 Huawei 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 문을 사용하여 함수 실행을 조기에 종료할 수 있습니다. 함수가 값을 반환하지 않는 경우.

임시 폴더는 임시 파일 저장 위치입니다. 시스템은 임시 파일을 이 폴더에 저장합니다. 임시 파일이 너무 많으면, 특히 임시 폴더가 시스템 디스크에 있는 경우 시스템 실행 속도에 영향을 미칠 수 있습니다. 임시 위치를 변경하여 문제를 해결할 수 있습니다. 아래를 살펴보겠습니다. Win7temp 위치 변경 튜토리얼 1. 먼저 "컴퓨터"를 마우스 오른쪽 버튼으로 클릭하고 "속성"을 엽니다. 2. 왼쪽의 "고급 시스템 설정"을 클릭합니다. 3. 아래의 "환경 변수"를 클릭합니다. 4. "temp"를 선택하고 "편집"을 클릭합니다 5 그런 다음 변경해야 하는 경로로 "변수 값"을 변경하면 됩니다.

소스 코드: publicclassReturnFinallyDemo{publicstaticvoidmain(String[]args){System.out.println(case1());}publicstaticintcase1(){intx;try{x=1;returnx;}finally{x=3;}}}# 출력 위 코드의 출력은 간단히 결론을 내릴 수 있습니다. return은 finally 전에 실행됩니다. 바이트코드 수준에서 무슨 일이 일어나는지 살펴보겠습니다. 다음은 case1 메소드의 바이트코드 일부를 가로채서 소스 코드를 비교하여 각 명령어의 의미를 주석으로 표시합니다.

Windows 11에서 캡처 도구가 작동하지 않는 이유 문제의 근본 원인을 이해하면 올바른 솔루션을 찾는 데 도움이 될 수 있습니다. 캡처 도구가 제대로 작동하지 않는 주요 이유는 다음과 같습니다. 초점 도우미가 켜져 있습니다. 이렇게 하면 캡처 도구가 열리지 않습니다. 손상된 응용 프로그램: 캡처 도구가 실행 시 충돌하는 경우 응용 프로그램이 손상되었을 수 있습니다. 오래된 그래픽 드라이버: 호환되지 않는 드라이버가 캡처 도구를 방해할 수 있습니다. 다른 응용 프로그램의 간섭: 실행 중인 다른 응용 프로그램이 캡처 도구와 충돌할 수 있습니다. 인증서가 만료되었습니다. 업그레이드 프로세스 중 오류로 인해 이 문제가 발생할 수 있습니다. 이 문제는 대부분의 사용자에게 적합하며 특별한 기술 지식이 필요하지 않습니다. 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는 많은 임시 파일이 포함된 "임시 폴더"를 의미하며, 그 기능은 사고로 인한 손실을 방지하기 위해 사용자의 작업 결과를 애플리케이션에 임시로 저장하는 것입니다. 임시 파일을 삭제하면 하드 디스크 저장 공간을 확보할 수 있지만, 삭제 후 처음으로 애플리케이션을 열 때 속도가 느려집니다.
