<?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 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

PHP는 현대적인 프로그래밍, 특히 웹 개발 분야에서 강력하고 널리 사용되는 도구로 남아 있습니다. 1) PHP는 사용하기 쉽고 데이터베이스와 완벽하게 통합되며 많은 개발자에게 가장 먼저 선택됩니다. 2) 동적 컨텐츠 생성 및 객체 지향 프로그래밍을 지원하여 웹 사이트를 신속하게 작성하고 유지 관리하는 데 적합합니다. 3) 데이터베이스 쿼리를 캐싱하고 최적화함으로써 PHP의 성능을 향상시킬 수 있으며, 광범위한 커뮤니티와 풍부한 생태계는 오늘날의 기술 스택에 여전히 중요합니다.

PHP에서는 약한 참조가 약한 회의 클래스를 통해 구현되며 쓰레기 수집가가 물체를 되 찾는 것을 방해하지 않습니다. 약한 참조는 캐싱 시스템 및 이벤트 리스너와 같은 시나리오에 적합합니다. 물체의 생존을 보장 할 수 없으며 쓰레기 수집이 지연 될 수 있음에 주목해야합니다.

\ _ \ _ 호출 메소드를 사용하면 객체를 함수처럼 호출 할 수 있습니다. 1. 객체를 호출 할 수 있도록 메소드를 호출하는 \ _ \ _ 정의하십시오. 2. $ obj (...) 구문을 사용할 때 PHP는 \ _ \ _ invoke 메소드를 실행합니다. 3. 로깅 및 계산기, 코드 유연성 및 가독성 향상과 같은 시나리오에 적합합니다.

섬유는 PHP8.1에 도입되어 동시 처리 기능을 향상시켰다. 1) 섬유는 코 루틴과 유사한 가벼운 동시성 모델입니다. 2) 개발자는 작업의 실행 흐름을 수동으로 제어 할 수 있으며 I/O 집약적 작업을 처리하는 데 적합합니다. 3) 섬유를 사용하면보다 효율적이고 반응이 좋은 코드를 작성할 수 있습니다.

PHP 커뮤니티는 개발자 성장을 돕기 위해 풍부한 자원과 지원을 제공합니다. 1) 자료에는 공식 문서, 튜토리얼, 블로그 및 Laravel 및 Symfony와 같은 오픈 소스 프로젝트가 포함됩니다. 2) 지원은 StackoverFlow, Reddit 및 Slack 채널을 통해 얻을 수 있습니다. 3) RFC에 따라 개발 동향을 배울 수 있습니다. 4) 적극적인 참여, 코드에 대한 기여 및 학습 공유를 통해 커뮤니티에 통합 될 수 있습니다.

PHP와 Python은 각각 고유 한 장점이 있으며 선택은 프로젝트 요구 사항을 기반으로해야합니다. 1.PHP는 간단한 구문과 높은 실행 효율로 웹 개발에 적합합니다. 2. Python은 간결한 구문 및 풍부한 라이브러리를 갖춘 데이터 과학 및 기계 학습에 적합합니다.

PHP는 죽지 않고 끊임없이 적응하고 진화합니다. 1) PHP는 1994 년부터 새로운 기술 트렌드에 적응하기 위해 여러 버전 반복을 겪었습니다. 2) 현재 전자 상거래, 컨텐츠 관리 시스템 및 기타 분야에서 널리 사용됩니다. 3) PHP8은 성능과 현대화를 개선하기 위해 JIT 컴파일러 및 기타 기능을 소개합니다. 4) Opcache를 사용하고 PSR-12 표준을 따라 성능 및 코드 품질을 최적화하십시오.

PHP의 미래는 새로운 기술 트렌드에 적응하고 혁신적인 기능을 도입함으로써 달성 될 것입니다. 1) 클라우드 컴퓨팅, 컨테이너화 및 마이크로 서비스 아키텍처에 적응, Docker 및 Kubernetes 지원; 2) 성능 및 데이터 처리 효율을 향상시키기 위해 JIT 컴파일러 및 열거 유형을 도입합니다. 3) 지속적으로 성능을 최적화하고 모범 사례를 홍보합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기
