ThinkPHP ^6图片操作进阶
图片裁剪、缩略、水印不再是TP框架系统内置的功能,需要安装。
目录
安装
图片处理
1.创建图片对象
2.获取图片属性
3.裁剪图像
4.生成缩略图
6.保存图像
7.水印
安装
使用composer在项目根目录打开命令行执行:
composer require topthink/think-image
过程如下:

查看composer.json

图片处理
1.创建图片对象
$image = \think\Image::open('./uploads/1.jpg');
图片对象属性
think\Image Object
([im:protected] => Resource id #165[gif:protected] => [info:protected] => Array([width] => 1920[height] => 1080[type] => jpeg[mime] => image/jpeg)
)
2.获取图片属性
echo ' 宽度:';
echo $image->width();echo ' 高度:';
echo $image->height();echo ' 类型:';
echo $image->type();echo ' 图片mime:';
echo $image->mime();echo ' 图片大小:';
print_r($image->size());
3.裁剪图像
使用crop()方法可以裁剪图片,并使用save()方法保存到指定路径;
/*** 裁剪图像** @param integer $w 裁剪区域宽度* @param integer $h 裁剪区域高度* @param integer $x 裁剪区域x坐标* @param integer $y 裁剪区域y坐标* @param integer $width 图像保存宽度* @param integer $height 图像保存高度** @return $this*/
public function crop($w, $h, $x = 0, $y = 0, $width = null, $height = null)// 只设置宽高
$image->crop(400,400)->save('./uploads/crop1.png');// 设置宽高和坐标
$image->crop(400,400, 200, 200)->save('./uploads/crop2.png');// 设置宽高和坐标 并保持图片宽高// 具体来说就是裁剪原图400*400,坐标200*200,并设置裁剪后的图片为500*500
$image->crop(400,400, 200, 200, 500, 500)->save('./uploads/crop3.png');
4.生成缩略图
使用thumb()方法,可以生成缩略图,配合save()把缩略图保存下来;
/*** 生成缩略图* @param integer $width 缩略图最大宽度* @param integer $height 缩略图最大高度* @param int $type 缩略图裁剪类型* @return $this*/
public function thumb($width, $height, $type = self::THUMB_SCALING)
例子:
$image->thumb(500,500)->save('./uploads/thumb6.png');
默认等比例类型裁剪
裁剪类型设置为第三个参数默认为:$type = self::THUMB_SCALING
而这个常量设定的定义如下:
const THUMB_SCALING = 1; // 常量,标识缩略图等比例缩放类型const THUMB_FILLED = 2; // 常量,标识缩略图缩放后填充类型const THUMB_CENTER = 3; // 常量,标识缩略图居中裁剪类型const THUMB_NORTHWEST = 4; // 常量,标识缩略图左上角裁剪类型const THUMB_SOUTHEAST = 5; // 常量,标识缩略图右下角裁剪类型const THUMB_FIXED = 6; // 常量,标识缩略图固定处理类型
5.旋转
使用rotate()方法,可以旋转图片,默认是90度,参数可以设置
/*** 旋转图像* @param int $degrees 顺时针旋转的度数* @return $this*/
public function rotate($degrees = 90)
例子:
$image->rotate()->save('./uploads/rotate1.png');
6.保存图像
save()方法可以配置的参数除了保存文件名的路径,还有以下几个:
/*** 保存图像* @param string $pathname 图像保存路径名称* @param null|string $type 图像类型* @param int $quality 图像质量* @param bool $interlace 是否对JPEG类型图像设置隔行扫描* @return $this*/
public function save($pathname, $type = null, $quality = 80, $interlace = true)
7.水印
图片水印
water()方法,给图片增加一个图片水印,默认位置为右下角,可看源码常量:
/*** 添加水印** @param string $source 水印图片路径* @param int $locate 水印位置* @param int $alpha 透明度* @return $this*/
public function water($source, $locate = self::WATER_SOUTHEAST, $alpha = 100)
水印位置参数
const WATER_SOUTHEAST = 9; // 右下角水印const WATER_SOUTHWEST = 7; // 左下角水印 const WATER_NORTHWEST = 1; // 左上角水印 const WATER_NORTHEAST = 3; // 右上角水印 const WATER_CENTER = 5; // 居中水印 const WATER_SOUTH = 8; // 下居中水印 const WATER_EAST = 6; // 右居中水印 const WATER_NORTH = 2; // 上居中水印 const WATER_WEST = 4; // 左居中水印 $locate = [x,y]; // 自定义水印坐标
例子:
$image->water('./uploads/mr.Yu.png', 9, 50)->save('./uploads/water1.png');
效果:
文字水印
text()方法,可以给图片增加一个文字水印。
需要字体文件,没有的先下载好
/*** 图像添加文字* @param string $text 添加的文字* @param string $font 字体路径* @param integer $size 字号* @param string $color 文字颜色* @param int $locate 文字写入位置* @param integer $offset 文字相对当前位置的偏移量* @param integer $angle 文字倾斜角度* @return $this* @throws ImageException*/
public function text($text, $font, $size, $color = '#00000000',$locate = self::WATER_SOUTHEAST, $offset = 0, $angle = 0) {
需要注意第五个参数,位置类型如下:
const WATER_SOUTHEAST = 9;// 右下角文字const WATER_SOUTHWEST = 7;// 左下角文字const WATER_NORTHWEST = 1;// 左上角文字const WATER_NORTHEAST = 3;// 右上角文字const WATER_CENTER = 5; // 居中文字const WATER_SOUTH = 8; // 下居中文字const WATER_EAST = 6; // 右居中文字const WATER_NORTH = 2; // 上居中文字const WATER_WEST = 4; // 左居中文字$locate = [x, y]; // 自定义文字坐标
例子:
// 获取当前工作目录
// getcwd()$image->text('Mr.Yu', getcwd().'/font/msyh.ttf', 10, '#ffffff', 7)
->save('./uploads/text1.png');
效果:

总结:
Think-image类封装的图片处理方法,可以很方便的对图片相应处理,节省自己摸索和验证时间。
相关文章:
ThinkPHP ^6图片操作进阶
图片裁剪、缩略、水印不再是TP框架系统内置的功能,需要安装。 目录 安装 图片处理 1.创建图片对象 2.获取图片属性 3.裁剪图像 4.生成缩略图 6.保存图像 7.水印 安装 使用composer在项目根目录打开命令行执行: composer require topthink/think…...
深入理解JS作用域链与执行上下文
变量提升: 变量提升( hoisting )。 我可恨的 var 关键字: 你读完下面内容就会明白标题的含义,先来一段超级简单的代码: <script type"text/javascript">var str Hello JavaScript hoi…...
UnityEditor编辑器扩展代码实现Project搜索的实现功能和切换Component等
反射实现切换Gameobjecect-Comp之前介绍过Kinematic Character Controller这个插件这个插件很容易和另外一个插件混淆,两个作者头像比较相像,而且这个插件的作者不太喜欢露脸(他现在做Dot-CharacterControl去了),几乎网…...
SKAdNetwork:从0到1
一、什么是SKAdNetwork https://developer.apple.com/documentation/storekit/skadnetwork iOS14.5开始,获取IDFA需要用户确认授权才可,此时SKAdNetwork 正式回归。 SKAdNetwork 是苹果在2018年推出的一个更加保护用户隐私的归因框架,并与…...
Spring+MVC+MYbatis注解开发
Spring常见注解 注解一:Configuration 用在类上面,加上这个注解的类可以成为一个spring的xml配置文件,使用的是java代码的配置 注解二:ComponentScan 用在类上,加上注解可以指定扫描路径 注解三:创建对…...
Redis主从复制过程
将目前服务器加入到端口号为6379的从服务器 一主二仆 当期中一台从服务器宕机之后 从服务器重启之后会变成单独的主服务器,与之前的主从复制没有关系,重新使用slaceof命令才能恢复到之前一样 主服务器宕机后,从服务器不会成为主服务器&…...
Spring boot开启定时任务的三种方式(内含源代码+sql文件)
Spring boot开启定时任务的三种方式(内含源代码sql文件) 源代码sql文件下载链接地址:https://download.csdn.net/download/weixin_46411355/87486580 目录Spring boot开启定时任务的三种方式(内含源代码sql文件)源代码…...
Tekton实战案例--S2I
案例环境说明 示例项目: 代码仓库:https://gitee.com/mageedu/spring-boot-helloWorld.git 构建工具maven pipeline各Task git-clone:克隆项目的源代码 build-to-package: 代码测试,构建和打包 generate-build-id:生…...
四、使用类实现功能
使用类实现功能 ts中类的继承 ES6中class类中,属性分为:实例上的属性,原型上的方法;也可以叫做:class的属性,class的方法。 类的继承叫法:父类>子类,基类>派生类;…...
Java多线程不安全的例子
目录 1. 可见性不安全例子 2. 原子性不安全例子 3. 有序性不安全例子 1. 可见性不安全例子 可见性:一个线程对共享变量的修改,另外一个线程不能够立刻看到。 如果多线程对共享数据进行访问而不采取同步操作的话,那么操作的结果是不一致…...
vivo X Flip会是高端手机市场的又一折叠屏爆款吗?
据多个平台消息,vivo即将推出小折叠屏手机X Flip。据了解,vivo X Flip将采用轻盈便携的竖向折叠布局,以及非常受女性消费者喜爱的结构设计。那么,vivo X Flip会是vivo折叠屏的又一个爆款吗? 一、vivo X Flip小折叠屏手…...
MySQL中MVCC如何解决不可重复读以及幻读?
了解MVCC之前,我们首先需要了解以下两个概念:一致性非锁定读和锁定读,了解这两个概念之后我们在逐步分析MVCC。 一致性非锁定读和锁定读 一致性非锁定读(快照读) 对于 一致性非锁定读的实现,通常做法是加一个版本号或者时间戳字…...
设计模式第八讲:观察者模式和中介者模式详解
一. 观察者模式 1. 背景 在现实世界中,许多对象并不是独立存在的,其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变。例如,某种商品的物价上涨时会导致部分商家高兴,而消费者伤心;还有&…...
关于 mac 本地配置域名能 ping 通,但是浏览器不能访问的问题(而其他电脑操作可访问)
关于 mac 本地配置域名能 ping 通,但是浏览器不能访问的问题(而其他电脑操作可访问)1. 配置域名的方式1.1 sudo vim /etc/hosts1.2 浏览器插件 LiveHosts2. 问题描述3. 解决问题方法3.1 尝试方法1—确保代理都关闭3.2 尝试方法2—确保域名能p…...
【代码随想录二刷】Day23-二叉树-C++
代码随想录二刷Day23 今日任务 669.修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 语言:C 669. 修剪二叉搜索树 链接:https://leetcode.cn/problems/trim-a-binary-search-tree/ 递归 class Solution { public:Tree…...
Linux GPIO 开发指南
文章目录Linux GPIO 开发指南1 概述1.1 编写目的1.2 适用范围1.3 相关人员2 模块介绍2.1 模块功能介绍2.2 相关术语介绍2.3 总体框架2.4 state/pinmux/pinconfig2.5 源码结构介绍3 模块配置3.1 kernel menuconfig 配置3.2 device tree 源码结构和路径3.2.1 device tree 对 gpio…...
记一次后端生成Zip文件通过浏览器下载后文件损坏,无法打开,不可预知的末端错误,下载后文件比源文件增大
记一次后端生成Zip文件问题前言问题出现排查一、流没有关好二、写入了空白字节三、没有flush定位环节一、生成二、通过SwaggerUI、PostMan进行下载三、结论解决方法前言 在项目上线前夕,临时添加了个数据导出的接口,需求是导出压缩包,选择了项…...
python中savgol_filter的详细解释
目录savgol_filter简介savgol_filter原理参数window_length对平滑的效果参数polyorder的平滑效果savgol_filter简介 Savitzky-Golay滤波器最初由Savitzky和Golay于1964年提出,是光谱预处理中常用滤波方法,它的核心思想是对一定长度窗口内的数据点进行k阶…...
C语言--指针进阶1
目录回顾字符指针指针数组数组指针&数组名和数组名的区别数组指针的使用指针作为形参练习数组参数、指针参数一维数组传参二维数组传参一级指针传参二级指针传参回顾 指针的内容,我们在初级阶段已经有所涉及了,我们先来复习一下 指针就是个变量&am…...
ssh的使用
Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接 我会一直往里填充内容哒! &…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
