php 实现:给图片加文字水印,图片水印,压缩图片
演示环境:
1、windows10
2、phpstudy
3、php7.4
一、案例演示:


二、素材准备
1、准备一张原始图片
2、准备一张水印图片(透明底图的最好)
3、字体库(windows系统自带的字体库,路径在:C:\Windows\Fonts)
4、开启GD库


三、图片添加水印
1、文字水印封装类 FontWatermark.class.php
<?phpclass FontWatermark
{private $sourceImagePath;private $fontPath;private $fontSize;private $watermarkText;private $outputImagePath;public function __construct($sourceImagePath, $fontPath, $fontSize, $watermarkText, $outputImagePath){$this->sourceImagePath = $sourceImagePath;$this->fontPath = realpath($fontPath); // 获取字体文件的绝对路径$this->fontSize = $fontSize;$this->watermarkText = $watermarkText;$this->outputImagePath = $outputImagePath;}public function addFontWatermark(){// 加载源图片$sourceImage = imagecreatefromjpeg($this->sourceImagePath);if (!$sourceImage) {die('无法加载源图片');}// 获取源图片的宽高$sourceWidth = imagesx($sourceImage);$sourceHeight = imagesy($sourceImage);// 确保字体文件存在if (!file_exists($this->fontPath)) {die('字体文件不存在: ' . $this->fontPath);}// 设置文字颜色 (白色)$white = imagecolorallocate($sourceImage, 255, 255, 255);// 设置文字阴影颜色 (黑色)$black = imagecolorallocate($sourceImage, 0, 0, 0);// 计算文字水印的边界框$textBox = imagettfbbox($this->fontSize, 0, $this->fontPath, $this->watermarkText);if ($textBox === false) {die('无法计算文字边界框');}$textWidth = $textBox[2] - $textBox[0];$textHeight = $textBox[1] - $textBox[7];// 设置文字水印的位置 (左上角)$destX = 10;$destY = $textHeight + 10;// 绘制阴影文字if (imagettftext($sourceImage, $this->fontSize, 0, $destX + 2, $destY + 2, $black, $this->fontPath, $this->watermarkText) === false) {die('无法绘制阴影文字');}// 绘制水印文字if (imagettftext($sourceImage, $this->fontSize, 0, $destX, $destY, $white, $this->fontPath, $this->watermarkText) === false) {die('无法绘制水印文字');}// 保存加水印后的图片if (!imagejpeg($sourceImage, $this->outputImagePath)) {die('无法保存加水印后的图片');}// 释放内存imagedestroy($sourceImage);echo "图片水印已添加并保存到: " . $this->outputImagePath;echo "<br>";echo "<img src='" . $this->outputImagePath . "' alt='文字水印' width='400px;' height='300px;'>";}
}
?>
2、调用文字水印类
<?php
require "FontWatermark.class.php";
// 使用示例
$watermark = new FontWatermark('1111.jpg', // 源图片路径'msyh.ttc', // 字体路径80, // 字体大小'测试水印', // 水印文字'font_watermark.jpg' // 输出图片路径
);$watermark->addFontWatermark();?>
四、图片添加图片水印
1、图片水印封装类 WatermarkImage.class.php
<?php
class WatermarkImage
{private $sourceImagePath;private $watermarkImagePath;private $outputImagePath;private $sourceImage;private $watermarkImage;public function __construct($sourceImagePath, $watermarkImagePath, $outputImagePath){$this->sourceImagePath = $sourceImagePath;$this->watermarkImagePath = $watermarkImagePath;$this->outputImagePath = $outputImagePath;}private function loadImages(){// 加载源图片$this->sourceImage = @imagecreatefromjpeg($this->sourceImagePath);if (!$this->sourceImage) {die('无法加载源图片: ' . $this->sourceImagePath);}// 加载水印图片$this->watermarkImage = @imagecreatefrompng($this->watermarkImagePath);if (!$this->watermarkImage) {imagedestroy($this->sourceImage);die('无法加载水印图片: ' . $this->watermarkImagePath);}}private function addWatermark(){// 获取源图片和水印图片的宽高$sourceWidth = imagesx($this->sourceImage);$sourceHeight = imagesy($this->sourceImage);$watermarkWidth = imagesx($this->watermarkImage);$watermarkHeight = imagesy($this->watermarkImage);// 计算水印位置(右下角)$destX = $sourceWidth - $watermarkWidth - 10; // 右边距10像素$destY = $sourceHeight - $watermarkHeight - 10; // 底边距10像素// 将水印图片合并到源图片上imagecopy($this->sourceImage, $this->watermarkImage, $destX, $destY, 0, 0, $watermarkWidth, $watermarkHeight);}private function saveImage(){// 保存加水印后的图片if (!imagejpeg($this->sourceImage, $this->outputImagePath)) {imagedestroy($this->sourceImage);imagedestroy($this->watermarkImage);die('无法保存加水印后的图片: ' . $this->outputImagePath);}}private function cleanup(){// 释放内存imagedestroy($this->sourceImage);imagedestroy($this->watermarkImage);}public function applyWatermark(){$this->loadImages();$this->addWatermark();$this->saveImage();$this->cleanup();echo "图片水印已添加并保存到: " . $this->outputImagePath;echo "<br>";echo "<img src='" . $this->outputImagePath . "' alt='图片水印' width='400px;' height='300px;'>";}
}?>
2、调用图片水印类
<?php
require "WatermarkImage.class.php";
// 使用示例
$sourceImagePath = '1111.jpg';
$watermarkImagePath = 'shuiyin.png';
$outputImagePath = 'image_watermark.jpg';$watermarker = new WatermarkImage($sourceImagePath, $watermarkImagePath, $outputImagePath);
$watermarker->applyWatermark();?>
五、压缩图片
1、缩略图封装类 ImageResizer
<?phpclass ImageResizer
{private $sourceImage;private $sourceWidth;private $sourceHeight;public function __construct($sourceImagePath){$this->loadImage($sourceImagePath);}private function loadImage($path){if (!file_exists($path)) {throw new Exception("File does not exist: $path");}$this->sourceImage = imagecreatefromjpeg($path);if (!$this->sourceImage) {throw new Exception("Failed to load image: $path");}$this->sourceWidth = imagesx($this->sourceImage);$this->sourceHeight = imagesy($this->sourceImage);}public function resize($width, $height, $outputPath){$thumb = imagecreatetruecolor($width, $height);imagecopyresampled($thumb,$this->sourceImage,0,0,0,0,$width,$height,$this->sourceWidth,$this->sourceHeight);if (!imagejpeg($thumb, $outputPath)) {throw new Exception("Failed to save thumbnail to: $outputPath");}imagedestroy($thumb);}public function __destruct(){imagedestroy($this->sourceImage);}
}?>
2、调用缩略图类
<?php
require "Resizer.class.php";// 使用示例
try {$sourceImagePath = 'E:\test\Resizer\222.jpg';// $outputImagePath = 'E:\test\Resizer\222_resier.jpg';$outputImagePath = '222_resier.jpg';$width = 200;$height = 200;$resizer = new ImageResizer($sourceImagePath);$resizer->resize($width, $height, $outputImagePath);echo "缩略图创建在网站目录下,图片名称: $outputImagePath";echo "<br>";echo "<img src='$outputImagePath' alt='缩略图'>";
} catch (Exception $e) {echo "错误: " . $e->getMessage();
}
?>
说明:更多复杂的水印功能可以基于此脚本扩展
相关文章:
php 实现:给图片加文字水印,图片水印,压缩图片
演示环境: 1、windows10 2、phpstudy 3、php7.4 一、案例演示: 二、素材准备 1、准备一张原始图片 2、准备一张水印图片(透明底图的最好) 3、字体库(windows系统自带的字体库,路径在:C:\Window…...
免费实现网站HTTPS访问
HTTPS(Hypertext Transfer Protocol Secure)是一种基于SSL协议的HTTP安全协议,旨在为客户端(浏览器)与服务器之间的通信提供加密通道,确保数据在传输过程中的保密性、完整性和身份验证。与传统的HTTP相比&a…...
vue3使用vue3-print-nb打印
打印效果 1.下载插件 Vue2.0版本安装方法 npm install vue-print-nb --saveVue3.0版本安装方法: npm install vue3-print-nb --save2.main.js引入 vue2引入 import Print from vue-print-nb Vue.use(Print)vue3引入 import print from vue3-print-nb // 打印…...
R语言ggplot2包绘制网络地图
重要提示:数据和代码获取:请查看主页个人信息!!! 载入R包 rm(listls()) pacman::p_load(tidyverse,assertthat,igraph,purrr,ggraph,ggmap) 网络节点和边数据 nodes <- read.csv(nodes.csv, row.names 1) edges…...
php获取今天凌晨零点的时间
不废话直接上代码 //使用strtotime $midnightToday strtotime("today midnight"); //输出:1716998400 //如果是明天 $midnightToday 86400 //后天 $midnightToday 86400*2//ORM中比对使用 $row ModelVisit::where(uid,$this->uid)->where(visi…...
CATIA进阶操作——创成式曲面设计入门(1)线架设计,三维点、直线、平面、曲线
目录 引出三维空间点生成三维直线三维平面三维曲线总结异形弹簧新建几何体草图编辑,画一条样条线进行扫掠,圆心和半径画出曲面上的螺旋线再次选择扫掠,圆心和半径 其他自定义信号和槽1.自定义信号2.自定义槽3.建立连接4.进行触发 自定义信号重…...
thinkphp6中怎么查看ThinkPHP版本号
<?php namespace app\controller; use app\BaseController; use think\app; //这句 class Index extends BaseController { public function test() { echo App::VERSION; //还有这句 } }...
第十二章 创建Web客户端
文章目录 第十二章 创建Web客户端SOAP向导的概述使用SOAP向导 第十二章 创建Web客户端 web客户端是访问web服务的软件。web客户端提供了一组代理方法,每个方法对应于web服务的一个方法。代理方法使用与它所对应的web服务方法相同的签名,并在被请求时调用…...
调试记录-RK平台用指令开启ADB功能
需求 嵌入式Linux系统调试过程中,为了方便,我们会借鉴Android调试的方法,在Linux系统添加adb功能,主要功能是通过USB线连接开发板和PC,实现两者之间传输文件,在PC上执行指令操作开发板。 实现 前提&…...
奇安信_NAC终端安全准入系统(相关问题整理)
奇安信终端安全准入系统 ,下称NAC 一、入网控制方式 1.IP流量控制 2.802.1X 准入 需要NAC、交换机、终端 以802.1X 3.DHCP 准入 将NAC作为DHCP服务器,为客户端分配地址,并对分配地址的客户端进行入网管控。 (*)可选 强制入网…...
在iPhone上恢复已删除的Safari历史记录的最佳方法
您是否正在寻找恢复 iPhone 上已删除的 Safari 历史记录的最佳方法?好吧,这篇文章提供了 4 种在有/无备份的情况下恢复 iPhone 上已删除的 Safari 历史记录的最佳方法。现在按照分步指南进行操作。 iPhone 上的 Safari 历史记录会被永久删除吗࿱…...
【设计模式深度剖析】【7】【结构型】【享元模式】| 以高脚杯重复使用、GUI中的按钮为例说明,并对比Java类库设计加深理解
👈️上一篇:外观模式 | 下一篇:结构型设计模式对比👉️ 设计模式-专栏👈️ 目录 享元模式定义英文原话直译如何理解?字面理解例子:高脚杯的重复使用例子:GUI中的按钮传统方式使用享元模式 4个角色1. …...
OceanBase 内存研究(OceanBase 3.2.4.5)
内存结构 从官网的结构图可以看出,一台observer可使用的总内存(memory_limit)包括 系统内存(system_memory) 和 租户内存(sys租户与普通租户) 系统内存 系统内存system_memory 属于 observer 的内部内存,允许其它租户共享使用该内存资源 (root10.0.0.…...
麒麟系统 安装xrdp 远程桌面方法记录
一、安装环境 麒麟V10 2107 ft2000 麒麟V10 2107 x86_64 二、安装准备 使用《Kylin-Desktop-V10-Release-2107-arm64.iso》镜像 做好U盘启动系统后,需要安装一个远程桌面工具,可以多用户在windows上使用远程桌面访问麒麟系统。 目前在linux系统上较…...
解析Java中1000个常用类:SafeVarargs类,你学会了吗?
在 Java 编程中,泛型和可变参数(varargs)的结合使用可能会导致一些类型安全的问题。为了解决这些问题,Java 提供了 @SafeVarargs 注解。本文将详细介绍 @SafeVarargs 注解的定义、使用方法、应用场景以及其背后的原理,帮助读者深入理解并掌握这一重要特性。 什么是 @Safe…...
【数据挖掘】3σ原则识别数据中的异常值(附代码)
写在前面: 首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 路虽远,行则将至&#…...
人眼是如何看到物体的
我在试图理解人眼如何观察到物体的,发现没有解释。本来我想这应该跟照相机照相的结果一样,但是发现,照相机也不对劲,没有理由能成像啊。 因为物体在散射光的时候,假设散射的光在局部是平行光,那么物体散射…...
vue打包时报错文件包过大
1.问题:npm run build 之后出现 2. 翻译之后意思就是某块过大 3. 解决办法:在vite.config.ts文件上添加 build: { chunkSizeWarningLimit: 1600, }, 4.最终打包...
预编码算法(个人总结)
引言 预编码算法是现代无线通信系统中的关键技术,特别是在多输入多输出(MIMO)系统中。它们通过在发送端对信号进行处理,减少干扰并提高信道容量。这种技术广泛应用于5G、Wi-Fi和卫星通信系统中。本教程将详细介绍预编码算法的背景…...
【重学C语言】十七、预处理指令
【重学C语言】十七、预处理指令 预处理指令预定义宏`#define` 宏定义示例注意事项特殊符号条件编译头文件包含`#pragma`预处理指令 C语言中的预处理指令(Preprocessor Directives)是一种特殊的指令,它们在编译过程的早期阶段(即实际编译之前)被预处理器(Preprocessor)处…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
【深度学习新浪潮】什么是credit assignment problem?
Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...
【深尚想】TPS54618CQRTERQ1汽车级同步降压转换器电源芯片全面解析
1. 元器件定义与技术特点 TPS54618CQRTERQ1 是德州仪器(TI)推出的一款 汽车级同步降压转换器(DC-DC开关稳压器),属于高性能电源管理芯片。核心特性包括: 输入电压范围:2.95V–6V,输…...
