ThinkPHP图片处理之压缩图片大小,图片处理之图片水印(添加平铺文字水印,并设置文字之间的间距和文字的角度)

安装扩展

使用Composer安装图像处理类库

composer require topthink/think-image

在对应的控制器内引入Image

use think\Image;

图片处理之压缩图片大小

public function upload(){
        $file = request()->file('image');
        // 将前端传过来的图片移动到项目目录下
        $info = $file->move('./upload/mobile');
        if($info){
            $file_edit = $info->getInfo();
            // *我们这里通过图片的大小判断图片是否需要被压缩,当然数值可以更改为你需要的
            if($file_edit['size'] > 100000){
                // 大于100K的图片进行处理
                // 获取上传的图片,进行图片压缩
                $image = \think\Image::open($info);
                // 保存图片的路径处理
                $date = date('Ymd');
                $name = $info->getSavename();
                $url_edit = './upload/mobile/'.$name;
                // 保存
                // 默认会按比例保存,但是最大宽度、高度不超过thumb(400, 400)设定值
                $img_edit = $image->thumb(400, 400)->save($url_edit);
                $url = $name;
            }else{
                $url = $info->getSavename();
            }
            return $this->json_success('上传成功', $url);
        }else{
            // 上传失败获取错误信息
            return $this->json_error('上传失败');
        }     
    }

图片处理之图片水印

代码示例

public function add(){
    if ($this->request->isPost()) {
            $data     = $this->request->post();
             // 获取上传成功的图片路径
             $roth = './upload/'.$data['photo'];
             // 打开图片
             $image = \think\Image::open($roth);
             // 加图片水印,其中water.png是已经做好的水印图片放在根目录下
             $image->water('./water.png',\think\Image::WATER_NORTHWEST)
                ->save($roth);
    }
}

效果预览

图片处理之图片水印

添加平铺文字水印,并设置文字之间的间距和文字的角度

代码示例

调用代码示例

public function test(){
   $image = Image::open('bg.jpg');
   //1.文字 2字体路径 3文字大小 4 文字颜色(#00000000)后面两位数可以控制文字的透明度  
   //5.文字的倾斜角度 6.x轴间距 7.y轴间距  注意字体路径是否正确
   $image>tiletext($text,'simkai.ttf',15,#ffffff,50,100,50)->save('look.jpg');
}

打开第三方类库文件:vendor\topthink\think-image\src\Image.php,把下面代码复制到上方地址的图片处理类库中(增加一个图片处理方法)

/**
     * 图像添平铺文字 带角度
     *
     * @param  string  $text   添加的文字
     * @param  string  $font   字体路径
     * @param  integer $size   字号
     * @param  string  $color  文字颜色
     * @param  integer $angle  文字倾斜角度
     * @param  int     $cx     x方向间距
     * @param  int     $cy     y方向间距
     * @return $this
     * @throws ImageException
     */
    public function tiletext($text, $font, $size, $color = '#00000000', $angle = 0 ,$cx = 10,$cy=10) {

        if (!is_file($font)) {
            throw new ImageException("不存在的字体文件:{$font}");
        }
        //获取文字信息
        $info = imagettfbbox($size, $angle, $font, $text);

        /* 设置颜色 */
        if (is_string($color) && 0 === strpos($color, '#')) {
            $color = str_split(substr($color, 1), 2);
            $color = array_map('hexdec', $color);
            if (empty($color[3]) || $color[3] > 127) {
                $color[3] = 0;
            }
        } elseif (!is_array($color)) {
            throw new ImageException('错误的颜色值');
        }
        do {
            //循环平铺水印 $this->info['width']是被处理图片的宽度
            for ($x = 0; $x < $this->info['width']; $x) {
                for ($y = 10; $y < $this->info['height']; $y) {
                    $col = imagecolorallocatealpha($this->im, $color[0], $color[1], $color[2], $color[3]);
                    imagettftext($this->im, $size, $angle, $x, $y, $col, $font, $text);
                    $y += $cy;
                }
                $x += $cx;
            }
            
        } while (!empty($this->gif) && $this->gifNext());
        return $this;
    }

效果预览

添加平铺文字水印,并设置文字之间的间距和文字的角度

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CS224W6.1——介绍图神经网络GNN

之前我们讨论了一些节点嵌入技术&#xff0c;它们可以通过随机游走的过程学习与任务无关的特征。从这篇开始&#xff0c;我们介绍了令人兴奋的图神经网络技术&#xff0c;该技术基于图结构用多层非线性变换对节点特征进行编码。图神经网络在各种任务中表现出非凡的性能&#xf…

BEVFormer 论文阅读

论文链接 BEVFormer BEVFormer&#xff0c;这是一个将Transformer和时间结构应用于自动驾驶的范式&#xff0c;用于从多相机输入中生成鸟瞰&#xff08;BEV&#xff09;特征利用查询来查找空间/时间&#xff0c;并相应地聚合时空信息&#xff0c;从而为感知任务提供更强的表示…

功能案例 -- 通过开关,改变白天和黑夜

效果展示 代码展示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><style>:root {--default-bac-color: #f…

ArduPilot开源代码之Aocoda-RC F405V2 Mark4 7“ PNP适配

ArduPilot开源代码之Aocoda-RC F405V2 Mark4 10"适配 1. 源由2. 安装2.1 Installing Ground Station (GCS) software2.2 Autopilot System Assembly Instructions2.3 Loading Firmware2.4 Connect Mission Planner to AutoPilot 3. 配置3.1 Basic System Overview3.2 Fram…

web前端开发第4次Dreamweave课堂练习/html练习代码《出版界推出一批纪念抗美援朝胜利70周年主题图书》

目标图片&#xff1a; 文字素材&#xff1a; 出版界推出一批纪念抗美援朝胜利70周年主题图书 2023-08-01来源&#xff1a;新华社 为纪念抗美援朝战争胜利70周年&#xff0c;出版界集中推出了“抗美援朝亲历记丛书”《新中国立国之战——抗美援朝战争的回顾与思考》《毛泽东与…

华为防火墙2种局域网内远程监控其它端口的方法

防火墙必须要工作在三层&#xff0c;接口上有地址 第一种用ip-link 这种方法是如果监测的接口故障后&#xff0c;自身优先级降低2 FW3 ip-link check enable ip-link 1 destination 1.1.1.1 interface g0/0/0 mode icmp hrp track ip-link 1 active FW4 ip-link check …

hive和spark-sql中 日期和时间相关函数 测试对比

测试版本&#xff1a; hive 2.3.4 spark 3.1.1 hadoop 2.7.7 1、增加月份 add_months(timestamp date, int months)add_months(timestamp date, bigint months)Return type: timestampusage:add_months(now(),1) 2、增加日期 adddate(timestamp startdate, int days)…

单链表指定结点的后插 前插操作

指定结点的后插操作 #define NULL 0typedef struct LNode {int data;struct LNode* next; }LNode, * LinkList;//后插操作&#xff1a;在p结点后插入元素e bool InsertNextNode(LNode* p, int e) {if (p NULL)return false;LNode* s (LNode*)malloc(sizeof(LNode));if (s N…

【MySQL】列属性

文章目录 CHAR和VARCHAR插入单行 INSERT INTO插入多行插入分层行 LAST_INSERT_IN()创建表复制 CREAT TABLE AS更新单行 UPDATE...SET更新多行在UPDATES中使用子查询【需着重复习】删除行 DELETE恢复数据库到原始状态 CHAR和VARCHAR CHAR(50)&#xff1a;存储文本占5个字符&…

Windows10 安装 Ubuntu(WSL2)

Windows10 安装 Ubuntu(WSL2)&#xff1a;因为 Ubuntu(WSL1) 不具备调试功能&#xff0c;所以尽可能安装 Ubuntu(WSL2)。 具体流程如下&#xff1a; 1. 什么是WSL Windows Subsystem for Linux&#xff08;简称WSL&#xff09;&#xff0c;Windows下的 Linux 子系统&#xff…

面试10000次依然会问的【ThreadLocal】,你还不会?

ThreadLocal简介与基本概念 ThreadLocal&#xff0c;即线程局部变量&#xff0c;是Java语言中用于实现线程数据隔离的一个重要类。这种机制允许在多线程环境中&#xff0c;每个线程都有自己的变量副本&#xff0c;从而使得每个线程都可以独立地改变自己的副本&#xff0c;而不…

【龙芯固件】ACPI——简介

一、 什么是ACPI ACPI是Hewlett-Packard, Intel, Microsoft, Phoenix, 和Toshiba共同制定的一个开放的行业规范。 ACPI由很多表组成&#xff0c;包括&#xff1a;RSDP&#xff0c;SDTH&#xff0c;RSDT&#xff0c;FADT&#xff0c;FACS&#xff0c;DSDT&#xff0c;SSDT&…

【操作系统面试题(32道)与面试Linux命令大全】

文章目录 操作系统面试题引论1.什么是操作系统&#xff1f;2.操作系统主要有哪些功能&#xff1f; 操作系统结构3.什么是内核&#xff1f;4.什么是用户态和内核态&#xff1f;5.用户态和内核态是如何切换的&#xff1f; 进程和线程6.并行和并发有什么区别&#xff1f;7.什么是进…

(2023|CVPR,扩散,主体标识符,先验保存损失)DreamBooth:微调文本到图像的扩散模型以实现主题驱动的生成

DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Driven Generation 公众号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 相关工作 3. 方法 3.…

Java 面试题之 Logback 打印日志是如何获取当前方法名称的?

在 Java 中&#xff0c;有四种方法可以获取当前正在执行方法体的方法名称&#xff0c;分别是&#xff1a; 使用 Thread.currentThread().getStackTrace() 方法 使用异常对象的 getStackTrace() 方法 使用匿名内部类的 getClass().getEnclosingMethod() 方法 Java 9 的 Stack…

Clickhouse学习笔记(10)—— 查询优化

单表查询 Prewhere 替代 where prewhere与where相比&#xff0c;在过滤数据的时候会首先读取指定的列数据&#xff0c;来判断数据过滤&#xff0c;等待数据过滤之后再读取 select 声明的列字段来补全其余属性 简单来说就是先过滤再查询&#xff0c;而where过滤是先查询出对应…

[LeetCode周赛复盘] 第 371 场周赛20231112

[LeetCode周赛复盘] 第 371 场周赛20231112 一、本周周赛总结100120. 找出强数对的最大异或值 I1. 题目描述2. 思路分析3. 代码实现 100128. 高访问员工1. 题目描述2. 思路分析3. 代码实现 100117. 最大化数组末位元素的最少操作次数1. 题目描述2. 思路分析3. 代码实现 100124…

Linux tail命令:显示文件结尾的内容

tail 命令和 head 命令正好相反&#xff0c;它用来查看文件末尾的数据&#xff0c;其基本格式如下&#xff1a; [rootlocalhost ~]# tail [选项] 文件名 此命令常用的选项及含义 【例 1】查看 /etc/passwd 文件最后 3 行的数据内容。 [rootlocalhost ~]# tail -n 3 /etc/passwd…

全域旅游“一机游”智慧旅游平台解决方案:PPT全文48页,附下载

关键词&#xff1a;智慧文旅解决方案&#xff0c;智慧旅游解决方案&#xff0c;智慧旅游平台建设方案&#xff0c;智慧文旅综合运营平台&#xff0c;智慧文旅建设方案 一、智慧文旅一机游定义 智慧文旅一机游是一种新型的旅游方式&#xff0c;它通过智能化的设备和系统&#…

(一)正点原子I.MX6ULL kernel6.1移植

一、概述 学完了正点原子的I.MX6ULL移植&#xff0c;正点原子的教程是基于Ubuntu18&#xff0c;使用的是4.1.15的内核&#xff0c;很多年前的了。NXP官方也发布了新的6.1的内核&#xff0c;以及2022.04的uboot。 本文分享一下基于Ubuntu22.04&#xff08;6.2.0-36-generic&…