当前位置: 首页 > news >正文

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作用域链与执行上下文

变量提升&#xff1a; 变量提升&#xff08; hoisting &#xff09;。 我可恨的 var 关键字&#xff1a; 你读完下面内容就会明白标题的含义&#xff0c;先来一段超级简单的代码&#xff1a; <script type"text/javascript">var str Hello JavaScript hoi…...

UnityEditor编辑器扩展代码实现Project搜索的实现功能和切换Component等

反射实现切换Gameobjecect-Comp之前介绍过Kinematic Character Controller这个插件这个插件很容易和另外一个插件混淆&#xff0c;两个作者头像比较相像&#xff0c;而且这个插件的作者不太喜欢露脸&#xff08;他现在做Dot-CharacterControl去了&#xff09;&#xff0c;几乎网…...

SKAdNetwork:从0到1

一、什么是SKAdNetwork https://developer.apple.com/documentation/storekit/skadnetwork iOS14.5开始&#xff0c;获取IDFA需要用户确认授权才可&#xff0c;此时SKAdNetwork 正式回归。 SKAdNetwork 是苹果在2018年推出的一个更加保护用户隐私的归因框架&#xff0c;并与…...

Spring+MVC+MYbatis注解开发

Spring常见注解 注解一&#xff1a;Configuration 用在类上面&#xff0c;加上这个注解的类可以成为一个spring的xml配置文件&#xff0c;使用的是java代码的配置 注解二&#xff1a;ComponentScan 用在类上&#xff0c;加上注解可以指定扫描路径 注解三&#xff1a;创建对…...

Redis主从复制过程

将目前服务器加入到端口号为6379的从服务器 一主二仆 当期中一台从服务器宕机之后 从服务器重启之后会变成单独的主服务器&#xff0c;与之前的主从复制没有关系&#xff0c;重新使用slaceof命令才能恢复到之前一样 主服务器宕机后&#xff0c;从服务器不会成为主服务器&…...

Spring boot开启定时任务的三种方式(内含源代码+sql文件)

Spring boot开启定时任务的三种方式&#xff08;内含源代码sql文件&#xff09; 源代码sql文件下载链接地址&#xff1a;https://download.csdn.net/download/weixin_46411355/87486580 目录Spring boot开启定时任务的三种方式&#xff08;内含源代码sql文件&#xff09;源代码…...

Tekton实战案例--S2I

案例环境说明 示例项目&#xff1a; 代码仓库&#xff1a;https://gitee.com/mageedu/spring-boot-helloWorld.git 构建工具maven pipeline各Task git-clone&#xff1a;克隆项目的源代码 build-to-package: 代码测试&#xff0c;构建和打包 generate-build-id&#xff1a;生…...

四、使用类实现功能

使用类实现功能 ts中类的继承 ES6中class类中&#xff0c;属性分为&#xff1a;实例上的属性&#xff0c;原型上的方法&#xff1b;也可以叫做&#xff1a;class的属性&#xff0c;class的方法。 类的继承叫法&#xff1a;父类>子类&#xff0c;基类>派生类&#xff1b…...

Java多线程不安全的例子

目录 1. 可见性不安全例子 2. 原子性不安全例子 3. 有序性不安全例子 1. 可见性不安全例子 可见性&#xff1a;一个线程对共享变量的修改&#xff0c;另外一个线程不能够立刻看到。 如果多线程对共享数据进行访问而不采取同步操作的话&#xff0c;那么操作的结果是不一致…...

vivo X Flip会是高端手机市场的又一折叠屏爆款吗?

据多个平台消息&#xff0c;vivo即将推出小折叠屏手机X Flip。据了解&#xff0c;vivo X Flip将采用轻盈便携的竖向折叠布局&#xff0c;以及非常受女性消费者喜爱的结构设计。那么&#xff0c;vivo X Flip会是vivo折叠屏的又一个爆款吗&#xff1f; 一、vivo X Flip小折叠屏手…...

MySQL中MVCC如何解决不可重复读以及幻读?

了解MVCC之前&#xff0c;我们首先需要了解以下两个概念&#xff1a;一致性非锁定读和锁定读&#xff0c;了解这两个概念之后我们在逐步分析MVCC。 一致性非锁定读和锁定读 一致性非锁定读(快照读) 对于 一致性非锁定读的实现&#xff0c;通常做法是加一个版本号或者时间戳字…...

设计模式第八讲:观察者模式和中介者模式详解

一. 观察者模式 1. 背景 在现实世界中&#xff0c;许多对象并不是独立存在的&#xff0c;其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变。例如&#xff0c;某种商品的物价上涨时会导致部分商家高兴&#xff0c;而消费者伤心&#xff1b;还有&…...

关于 mac 本地配置域名能 ping 通,但是浏览器不能访问的问题(而其他电脑操作可访问)

关于 mac 本地配置域名能 ping 通&#xff0c;但是浏览器不能访问的问题&#xff08;而其他电脑操作可访问&#xff09;1. 配置域名的方式1.1 sudo vim /etc/hosts1.2 浏览器插件 LiveHosts2. 问题描述3. 解决问题方法3.1 尝试方法1—确保代理都关闭3.2 尝试方法2—确保域名能p…...

【代码随想录二刷】Day23-二叉树-C++

代码随想录二刷Day23 今日任务 669.修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 语言&#xff1a;C 669. 修剪二叉搜索树 链接&#xff1a;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进行下载三、结论解决方法前言 在项目上线前夕&#xff0c;临时添加了个数据导出的接口&#xff0c;需求是导出压缩包&#xff0c;选择了项…...

python中savgol_filter的详细解释

目录savgol_filter简介savgol_filter原理参数window_length对平滑的效果参数polyorder的平滑效果savgol_filter简介 Savitzky-Golay滤波器最初由Savitzky和Golay于1964年提出&#xff0c;是光谱预处理中常用滤波方法&#xff0c;它的核心思想是对一定长度窗口内的数据点进行k阶…...

C语言--指针进阶1

目录回顾字符指针指针数组数组指针&数组名和数组名的区别数组指针的使用指针作为形参练习数组参数、指针参数一维数组传参二维数组传参一级指针传参二级指针传参回顾 指针的内容&#xff0c;我们在初级阶段已经有所涉及了&#xff0c;我们先来复习一下 指针就是个变量&am…...

ssh的使用

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...