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();
}
?>

说明:更多复杂的水印功能可以基于此脚本扩展

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/20097.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Navicat连接Oracle

目标&#xff1a; 1.Navicat连接Oracle数据库&#xff0c;报错 无监听程序。 一、下载安装Navicat15 https://zhuanlan.zhihu.com/p/675991635 下载安装资源 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;1u1q 二、测试SQL PLUS连接数据库 在全部程序--》Ora…

Python | Leetcode Python题解之第123题买卖股票的最佳时机III

题目&#xff1a; 题解&#xff1a; class Solution:def maxProfit(self, prices: List[int]) -> int:n len(prices)buy1 buy2 -prices[0]sell1 sell2 0for i in range(1, n):buy1 max(buy1, -prices[i])sell1 max(sell1, buy1 prices[i])buy2 max(buy2, sell1 - …

Hadoop+Spark大数据技术 第七次作业

第七次作业 1. 简述Spark SQL使用的数据抽象DataFrame与Dataset的区别。 DataFrame: 基于 Row 对象的二维表格结构&#xff0c;类似于关系型数据库中的表。 行和列都有明确的 Schema&#xff08;模式&#xff09;&#xff0c;可以进行类型推断。 提供了丰富的操作接口&#xff…

docker私有镜像仓库的搭建及认证

简介&#xff1a; docker私有镜像仓库的搭建及认证 前言 在生产上使用的 Docker 镜像可能包含我们的代码、配置信息等&#xff0c;不想被外部人员获取&#xff0c;只允许内 网的开发人员下载。 Docker 官方提供了一个叫做 registry 的镜像用于搭建本地私有仓库使用。在内部网…

苍穹外卖数据可视化

文章目录 1、用户统计2、订单统计3、销量排名Top10 1、用户统计 所谓用户统计&#xff0c;实际上统计的是用户的数量。通过折线图来展示&#xff0c;上面这根蓝色线代表的是用户总量&#xff0c;下边这根绿色线代表的是新增用户数量&#xff0c;是具体到每一天。所以说用户统计…

CS4344国产替代音频DAC数模转换芯片DP7344采样率192kHz

目录 DAC应用简介DP7344简介结构框图DP7344主要特性微信号&#xff1a;dnsj5343参考原理图 应用领域 DAC应用简介 DAC&#xff08;中文&#xff1a;数字模拟转换器&#xff09;是一种将数字信号转换为模拟信号&#xff08;以电流、电压或电荷的形式&#xff09;的设备。电脑对…

BSD盲区检测系统性能要求及试验方法

相关术语 盲区检测(bsd,blind spot detection)试验车辆(subject vehicle)目标车辆(target vehicle)横向距离(lateral distance):试验车车身最外缘(不包含外后视镜)与目标车辆车身最外缘(不包含外后视镜)之间的横向距离。 纵向距离(longitudinal distance):试验…

SpringBoot的第二大核心AOP系统梳理

目录 1 事务管理 1.1 事务 1.2 Transactional注解 1.2.1 rollbackFor 1.2.2 propagation 2 AOP 基础 2.1 AOP入门 2.2 AOP核心概念 3. AOP进阶 3.1 通知类型 3.2 通知顺序 3.3 切入点表达式 execution切入点表达式 annotion注解 3.4 连接点 1 事务管理 1.1 事务…

云计算与 openstack

文章目录 一、 虚拟化二、云计算2.1 IT系统架构的发展2.2 云计算2.3 云计算的服务类型 三、Openstack3.1 OpenStack核心组件 一、 虚拟化 虚拟化使得在一台物理的服务器上可以跑多台虚拟机&#xff0c;虚拟机共享物理机的 CPU、内存、IO 硬件资源&#xff0c;但逻辑上虚拟机之…

组装电脑(使用老机箱)

昨天同事拿来一台联想 ThinkCentre M6210t的台式机&#xff0c;说计算机实在是太慢了&#xff0c;在只保留主机箱想升级一下。   她拿来了配件&#xff0c;有电源、主板、CPU、CPU风扇、内存条、机箱风扇、硬盘&#xff1a;   主板&#xff1a;华硕 Prime H610M-K D4&#…

element-ui表格全选

项目场景&#xff1a; 根据项目需求&#xff0c;要求在表格外加【全选】复选框&#xff0c;切换分页也需将每一行都勾选上 实现方式&#xff1a; 借用element-ui文档的这几个方法和属性 <el-checkboxv-model"checkAll"change"handleCheckAllChange"&g…

【计算机网络】——物理层(图文并茂)

物理层 一.物理层概述1.物理层要实现的功能2.物理层接口特征1.机械特性2.电气特性3.功能特性4.过程特性 二.物理层下面的传输媒体1.传输媒体的分类2.导向型传输媒体1.同轴电缆2.双绞线3.光纤 3.非导向型传输媒体1.无线电波2.微波3.红外线4.激光5.可见光 三.传输方式1.串行传输与…

自动化桌面整理新时代:Llama 3驱动的智能文件管理系统

在信息爆炸的时代,个人和企业用户的电脑桌面常常被海量文件占据,导致查找特定文件如同大海捞针。为了解决这一痛点,Llama 3应运而生——一个集成了先进多模态AI技术的智能文件管家,旨在将杂乱无章的文件世界变得井然有序。本文将深入探讨Llama 3如何利用其创新功能,不仅自…

研发效能DevOps: Ubuntu 部署 JFrog 制品库

目录 一、实验 1.环境 2.Ubuntu 部署 JFrog 制品库 3.Ubuntu 部署 postgresql数据库 4.Ubuntu 部署 Xray 5. 使用JFrog 增删项目 二、问题 1.Ubuntu 如何通过apt方式部署 JFrog 制品库 2.Ubuntu 如何通过docker方式部署 JFrog 制品库 3.安装jdk报错 4.安装JFrog Ar…

javascript DOM 属性详解:读取、修改、移除

No.内容链接1Openlayers 【入门教程】 - 【源代码示例300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3Cesium 【入门教程】 - 【源代码图文示例200】 4MapboxGL【入门教程】 - 【源代码图文示例150】 5前端就业宝典 【面试题详细答案 1000】 文章目录 一、读取…

动态路由协议实验——RIP

动态路由协议实验——RIP 什么是RIP ​ RIP(Routing Information Protocol,路由信息协议&#xff09;是一种内部网关协议&#xff08;IGP&#xff09;&#xff0c;是一种动态路由选择协议&#xff0c;用于自治系统&#xff08;AS&#xff09;内的路由信息的传递。RIP协议基于…

实时数据传输:Django 与 MQTT 的完美结合

文章目录 准备工作创建 Django 项目与应用设置 MQTT 服务器编写 Django 视图编写前端模板发布 MQTT 消息运行 Django 项目 在当今互联网应用中&#xff0c;实时数据传输已经成为许多项目的核心需求。无论是社交媒体平台、在线游戏、金融交易还是物联网设备&#xff0c;都需要及…

Python—面向对象小解(3)

一、多态 多态指的是一类事物的多中形态 相同的方法&#xff0c;产生不同的执行结果 运算符 * 的多态 int int 加法计算 str str 字符串拼接 list list 列表的数据合并 在python中可以使用类实现一个多态效果 在python中使用重写的方式实现多态 &#xff08;1&#xff09;定…

飞腾D2000+FPGA云终端,实现从硬件、操作系统到应用的完全国产、自主、可控

飞腾云终端基于国产化飞腾高性能8核D2000处理器平台的国产自主可控解决方案&#xff0c;搭载昆仑国产化固件,支持UOS、银河麒麟等国产操作系统&#xff0c;满足国产化信息安全运算的需求&#xff0c;实现从硬件、操作系统到应用的完全国产、自主、可控&#xff0c;是国产信息安…

WireShark抓包软件的使用 上海商学院 计算机网络 实验作业3

实验目的 &#xff08;1&#xff09;熟悉wireShark软件操作界面和操作步骤&#xff1b; &#xff08;2&#xff09;学会捕获过滤器的设置方法&#xff1b; &#xff08;3&#xff09;学会显示过滤器的设置方法&#xff1b; &#xff08;4&#xff09;学会使用捕获报文的统计…