[league/glide]两行代码实现一套强大的图片处理HTTP服务

news2024/10/1 12:19:11

只要两行代码,就能实现类似对象存储云提供的基于参数的图片处理,比如裁剪、放大、水印、旋转等等。

我们经常使用第三方的对象存储服务,比如七牛云或阿里云,他们都提供了“智能媒体服务”,其实就是在链接上加上各种参数,实现图片的裁剪、缩放等,可以便捷的实现缩略图,节省网络宽带,加快页面的访问。

原理很简单,就是接收参数然后处理呗。如果用PHP做的话,不难,但是却要写好多代码。操作GD库太麻烦了。但现在,只要两行代码就能实现一套强大的图片处理功能。

// 实例化
$server = League\Glide\ServerFactory::create([
    'source' => 'path/to/source/folder',
    'cache' => 'path/to/cache/folder',
]);

// 可以在第二个参数传入数组
$server->outputImage('users/1.jpg', ['w' => 300, 'h' => 400]);

// 更简单的做法,直接传入GET参数
$server->outputImage($path, $_GET);

功能预览表

glide可以接收26个参数,几乎可以涵盖所有的场景需求。

名称功能参数介绍
方向or旋转图像,支持0, 90, 180或者 270,同时支持auto,会根据图片的Exif 信息自动确定位置
翻转flip翻转图像,支持水平、垂直、圆心等
裁剪crop将图像裁剪到指定尺寸,支持居中、左上角、居左等10多个设置
宽度w设置图像的宽度,根据fit参数表现不同
高度h设置图像的高度,根据fit参数表现不同
尺寸效果fit设置图像如何适应新的尺寸,显示最大宽度、最小宽度、变形、裁剪等等6中效果
设备像素比dpr通过此参数可以生成不同像素比的图片,在苹果和安卓设备中有更好的表现,最大8
亮度bri调整图像亮度
对比度con调整图像对比度
伽马gam调整图像伽马值值
锐化sharp锐化图像
模糊blur为图像增加模糊效果
像素化pixel为图像增加像素化效果
滤镜filt能够指定使用那些滤镜处理图像,内置灰度和褐色,可以自定义。
水印路径mark给图像增加水印
水印宽度markw设置水印的宽度
水印高度markh设置水印的高度
水印偏移量Xmarkx水印的X偏移量
水印偏移量Ymarky水印的Y偏移量
水印的填充markpad水印的填充,padding
水印的定位markpos水印的位置,居左、居中等
水印的透明度markalpha设置水印的透明度
背景bg设置图片的背景色
边框border给图片增加边框
质量q设置输入的质量
格式fm设置图像的编码格式,jpg、png等

功能介绍

本文对几个重点的功能做个介绍。

尺寸效果 fit

设置图像如何适应新的尺寸。

支持的参数:

  • contain: 默认。 调整图像大小以适应宽度和高度边界,而无需裁剪、扭曲或改变纵横比。
  • max:调整图像大小以适应宽度和高度边界,而不会裁剪、扭曲或改变纵横比,如果图像小于输出尺寸,也不会增加图像的尺寸。
  • fill:调整图像大小以适应宽度和高度边界,而不裁剪或扭曲图像,剩余空间用背景色填充。 生成的图像将匹配约束尺寸。
  • fill-max:调整图像大小以适应宽度和高度边界而不裁剪,但如果图像较小则放大图像。 完成的图像将在宽度或高度上具有剩余空间(除非新图像的纵横比与旧图像的纵横比相同)。 剩余空间将用背景色填充。 生成的图像将匹配约束尺寸。
  • stretch:拉伸图像以完全适合约束尺寸。 生成的图像将填充尺寸,并且不会保持输入图像的纵横比。
  • crop:调整图像大小以填充宽度和高度边界并裁剪任何多余的图像数据。 生成的图像将匹配宽度和高度限制,而不会扭曲图像。

裁剪 crop

当尺寸效果设置为裁剪时,可以使用裁剪参数。

裁剪位置:

您还可以通过添加裁剪位置来设置裁剪图像的位置。 接受 crop-top-left, crop-top, crop-top-right, crop-left, crop-center, crop-right, crop-bottom-left, crop-bottom或者 crop-bottom-right. 默认是 crop-center, 并且与 crop.

作物焦点

除了裁剪位置之外,您还可以使用焦点更具体地确定确切的裁剪位置。 这是使用两个偏移百分比定义的: crop-x%-y%.

<img src="kayaks.jpg?w=300&h=300&fit=crop-25-75">

您还可以选择通过提供第三个值来放大您的焦点:一个介于 1 和 100 之间的浮点数。每个完整步长相当于 100% 缩放。 (例如。 x%-y%-2相当于以 200% 的比例查看图像)。 建议的范围是 1-10。

<img src="kayaks.jpg?w=300&h=300&fit=crop-25-75-2">

预裁剪

在任何其他调整大小操作之前将图像裁剪为特定尺寸。 要求的格式: width,height,x,y. 就像使用截图工具那样,在先在图片上截取一段。

<img src="kayaks.jpg?crop=100,100,915,155">

存储驱动

可以使用flysystem驱动,这意味着不仅可以操作本地的文件,还支持各类存储方式,比如SFTP、FTP、对象存储等等。

// 图片地址
$source = new League\Flysystem\Filesystem(
    new League\Flysystem\Local\LocalFilesystemAdapter('path/to/source/folder')
);

// 缓存地址
$cache = new League\Flysystem\Filesystem(
    new League\Flysystem\Local\LocalFilesystemAdapter('path/to/cache/folder')
);

$server = new League\Glide\Server(
    $source,
    $cache,
);

标准返回Response

可以通过getImageResponse方法获取标准的PSR-7响应对象,同时官方提供了laravel等框架的扩展响应对象。

默认配置

可以设置默认的图片处理设置。

$server = League\Glide\ServerFactory::create([
    'defaults' => [
        'mark' => 'logo.png',
        'markw' => '30w',
        'markpad' => '5w',
    ]
]);

预设

可以提前将各种参数设置好,然后直接传入预设的名称即可。比如下面的代码:

<?php

$server = League\Glide\ServerFactory::create([
    'presets' => [
        'small' => [
            'w' => 200,
            'h' => 200,
            'fit' => 'crop',
        ],
        'medium' => [
            'w' => 600,
            'h' => 400,
            'fit' => 'crop',
        ]
    ]
]);

然后直接使用预设就可以了:

<img src="kayaks.jpg?p=small">

也可以同时使用多个预设:

<img src="kayaks.jpg?p=small,watermarked">

甚至可以使用带有附加参数的预设:

<img src="kayaks.jpg?p=small,watermarked&filt=sepia">

图像驱动

支持GD库和Imagick库。

$server = League\Glide\ServerFactory::create([

    // 默认使用GD
    'driver' => 'gd',

    // 使用ImageMagick
    'driver' => 'imagick',
]);

安装

使用compsoer安装即可。

composer require league/glide

安全保护

glide提供了一套签名机制,通过私钥(一长串字符)生成一个token,只有携带了这个token 才能调用参数,避免人们通过大量的图像调整参数攻击服务器。

配置

<?php

use League\Glide\Signatures\SignatureFactory;
use League\Glide\Signatures\SignatureException;

try {
    // 设置秘钥
    $signkey = 'v-LK4WCdhcfcc%jt*VC2cj%nVpu+xQKvLUA%H86kRVk_4bgG8&CWM#k*b_7MUJpmTc=4GFmKFp7=K%67je-skxC5vz+r#xT?62tT?Aw%FtQ4Y3gvnwHTwqhxUh89wCa_';

    // 验证访问
    SignatureFactory::create($signkey)->validateRequest($path, $_GET);

} catch (SignatureException $e) {
    // 处理异常
}

生成URL

<?php

use League\Glide\Urls\UrlBuilderFactory;

// 上面的那个秘钥
$signkey = 'v-LK4WCdhcfcc%jt*VC2cj%nVpu+xQKvLUA%H86kRVk_4bgG8&CWM#k*b_7MUJpmTc=4GFmKFp7=K%67je-skxC5vz+r#xT?62tT?Aw%FtQ4Y3gvnwHTwqhxUh89wCa_';

// 实例化
$urlBuilder = UrlBuilderFactory::create('/img/', $signkey);

// 生成url
$url = $urlBuilder->getUrl('cat.jpg', ['w' => 500]);

// 使用url
echo '<img src="'.$url.'">';

// 输入预览
<img src="/img/cat.jpg?w=500&s=af3dc18fc6bfb2afb521e587c348b904">

总结

只要简单的几行代码,就实现了一套健全的图片处理HTTP服务,当你有类似的需求的时候,抓紧用上吧。

原文标题:[league/glide]两行代码实现一套强大的图片处理HTTP服务

原文地址:https://phpreturn.com/index/a64084605c3759.html

原文平台:PHP武器库

版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。

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

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

相关文章

Vue:(三十四)Vuex及其属性

Vuex的学习更多是代码了&#xff0c;所以就放在一起了&#xff0c;接下来大概说一下吧。概念&#xff1a;专门在Vue中实现集中式状态&#xff08;数据&#xff09;管理的一个Vue插件&#xff0c;对Vue应用中多个组件的共享状态进行集中式的管理&#xff08;读/写&#xff09;&a…

【Git】P4 Git 远程仓库(2)克隆,抓取与拉取

Git 克隆&#xff0c;拉取与抓取git 克隆 clonegit 拉取 fetch、合并 mergegit 抓取 pullgit 克隆 clone 克隆的使用场景很少&#xff0c;举个例子&#xff0c;老板给你一个任务&#xff1a;这个服务的 bug 由你来解决&#xff1a;那么你的第一步就是从云端克隆到本地&#xf…

VMware 搭建 Linux 系统

前言 使用 VMware Workstation 17 Pro 基于CentOS 7.9 镜像搭建 K8S 一主多从本地虚拟服务器环境 主机名IP配置k8s-master192.168.179.214核CPU 8G内存 20G硬盘k8s-node1192.168.179.224核CPU 8G内存 20G硬盘k8s-node2192.168.179.234核CPU 8G内存 20G硬盘VMware 下载安装 VMw…

Spark读取JDBC调优

Spark读取JDBC调优&#xff0c;如何调参一、场景构建二、参数设置1.灵活运用分区列实际问题&#xff1a;工作中需要读取一个存放了三四年历史数据的pg数仓表&#xff08;缺少主键id&#xff09;&#xff0c;需要将数据同步到阿里云 MC中&#xff0c;Spark在使用JDBC读取关系型数…

案例13-localStorage的使用分析

1、背景介绍 大家看下边的逻辑是否能看明白呢&#xff1f; 前端在调用后端接口获取某一个人的评论次数、获赞次数、回复次数。调用之后判断后端返回过来的值。如果返回回来的值是0的话&#xff0c;从缓存中获取对应的值&#xff0c;如果从缓存中获取的评论次数为空那么其他两…

数据结构——线性数据结构(C语言实现单链表详解)

什么是单链表&#xff1f; 单链表就是一种线性的链式数据结构。单链表通过节点来存储线性数据的&#xff0c;单链表不要求连续的物理空间来存储数据。但是&#xff0c;单链表在逻辑结构上是连续的。通常&#xff0c;会有一个头指针指向单链表的首结点因为单链表的结点会存储一…

【云原生】持久化存储之NFS

文章目录介绍一、NFS1. 部署nfs1.1 找一台服务器作为nfs服务端1.2 检查&#xff1a;1.3 创建挂载路径1.4 在nfs服务器启动nfs服务2. 所有node节点部署nfs服务3. 测试—部署nginx应用&#xff0c;使用nfs持久网络存储二、 PV和PVC2.1 PV2.2 PVC2.3 实现流程2.4 PV&PVC挂载步…

day61-day62【代码随想录】二刷数组

文章目录前言一、有效三角形的个数【二分法】二、Pow(x, n)&#xff08;力扣50&#xff09;方法一方法二三、在 D 天内送达包裹的能力&#xff08;力扣1011&#xff09;【二分法】四、制作 m 束花所需的最少天数&#xff08;力扣1482&#xff09;【二分法】每日一题&#xff1a…

你真的知道MySQL索引组织数据的形式吗??

MySQL索引背后的数据结构前言MySQLMySQL背后的数据结构B树B树前言 好久不见,困扰了我许久的阴霾终于散去了,但是随之而来的是学校堆积如山的任务考试,这段时间不可否认我的学习效率和学习效果不是很佳,但是我之前就说过学习是需要贯穿程序猿一生的事情,流水不争先,争的是滔滔不…

Python基础 | Miniconda的安装

文章目录什么是Miniconda3Miniconda安装JupyterMiniconda运行JupyterMiniconda安装SpyderMiniconda和Anaconda对比Miniconda安装第三方库什么是Miniconda3 Miniconda是conda的免费的最小安装包。它是Anaconda的小型引导程序版本&#xff0c;仅包含了conda&#xff0c;Python&a…

【架构师】跟我一起学架构——Serverless

博客昵称&#xff1a;架构师Cool 最喜欢的座右铭&#xff1a;一以贯之的努力&#xff0c;不得懈怠的人生。 作者简介&#xff1a;一名Coder&#xff0c;软件设计师/鸿蒙高级工程师认证&#xff0c;在备战高级架构师/系统分析师&#xff0c;欢迎关注小弟&#xff01; 博主小留言…

个人收集的网站,可以参考(程序员可收藏)

程序员是一个需要不断学习的职业&#xff0c;幸运的是&#xff0c;在这个互联网时代&#xff0c;有很多渠道可以获取知识。 1在线教程 1、how2j.cn 地 址&#xff1a;https://how2j.cn/ 简 介&#xff1a;一个Java全栈开发教程网站&#xff0c;内容全面&#xff0c;简洁…

Docker Desktop安装本地Kubernetes集群

目录 下载安装说明 下载Docker Desktop windows需要开启Hyper-v 启用kubernetes kubectl配置 设置path环境变量 验证安装是否成功 实现Nginx容器的部署 按顺序进行nginx创建 Nginx的相关信息 Setup local Kubernetes cluster with Docker Desktop - DEV Community 上面…

UNIX网络编程-卷1_TCP粘包问题解决方法

这篇文件记录流协议粘包问题。首先记录什么是粘包&#xff0c;其次介绍粘包产生的原因&#xff0c;最后给出粘包的解决方法。 1 流协议与粘包 第一种情况&#xff1a;主机B一次读一个M消息 &#xff0c;不会产生粘包&#xff1b; 第二种情况&#xff1a;主机B一次读M1M2个消息…

数据模型(下):反规范化和维度模型

接前文: 数据模型(上)_专治八阿哥的孟老师的博客-CSDN博客 数据模型(中):键和规范化_专治八阿哥的孟老师的博客-CSDN博客 5.反规范化 反规范化是选择性地违反规范化规则并在模型中重新引入冗余的过程,额外的冗余有助于降低数据检索的时间,且创建一个用户友好的模型。 数…

一文吃透 Spring 中的IOC和DI

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

【Redis应用】查询缓存相关问题解决(二)

&#x1f697;Redis应用学习第二站~ &#x1f6a9;起始站&#xff1a;【Redis应用】基于Redis实现共享session登录(一) &#x1f6a9;本文已收录至专栏&#xff1a;Redis技术学习 &#x1f44d;希望您能有所收获&#xff0c;底部附有完整思维导图 一.概述 本篇我们会一起来学习…

项目管理工具DHTMLX Gantt灯箱元素配置教程:只读模式

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的大部分开发需求&#xff0c;具备完善的甘特图图表库&#xff0c;功能强大&#xff0c;价格便宜&#xff0c;提供丰富而灵活的JavaScript API接口&#xff0c;与各种服务器端技术&am…

【深度探讨】公共部门在选择区块链平台时要考虑的6个方面

发表时间&#xff1a;2022年8月17日 信息来源&#xff1a;bsvblockchain.org 与私营企业相比&#xff0c;全球的公共部门组织在考虑升级软件解决方案时面临着一系列的全新挑战。公共部门的决策流程冗长而复杂&#xff0c;他们要不惜一切代价避免对现有业务造成干扰&#xff0c;…

ISP全流程简介

ISP的pipline总结 ISP(Image Signal Processor)&#xff0c;即图像处理&#xff0c;主要作用是对前端图像传感器输出的信号做后期处理&#xff0c;主要功能有线性纠正、噪声去除、坏点去除、内插、白平衡、自动曝光控制等&#xff0c;依赖于ISP才能在不同的光学条件下都能较好…