图片处理
图片处理在上传后直接修改原图,例如裁剪、调整尺寸、添加滤镜、添加文字或图片水印、转换格式。处理后的图片会覆盖原图;如果只想在访问时生成不同尺寸的图片、保留原图,请使用云处理。
在管理后台的「图片处理」页面创建图片处理驱动,然后在储存的「处理器」标签页中关联,上传到该储存的图片就会按驱动中的规则处理。
处理规则
点击「添加处理规则」按钮添加规则。规则分为以下几类,执行时按表中分类的顺序(裁剪、尺寸、滤镜、旋转、文本、水印)依次执行,同一类中的规则按排列顺序执行。例如先添加了水印、后添加了尺寸规则,仍然先调整尺寸再加水印:
| 分类 | 规则 |
|---|---|
| 裁剪 | 裁剪并缩放、裁剪图片、修剪图像 |
| 尺寸 | 调整为指定尺寸、按比例缩放、填充缩放、包含缩放、调整画布、相对调整画布 |
| 滤镜 | 亮度、对比度、伽马校正、颜色校正、灰度、水平或垂直镜像、模糊、锐化、反转颜色、像素化 |
| 旋转 | 图像旋转 |
| 文本 | 文字水印:内容、位置、字体、颜色、描边、角度、是否平铺等 |
| 水印 | 图片水印:水印图片、位置、不透明度、大小比例、是否平铺等 |
尺寸和裁剪类规则中,带「不超出原尺寸」的版本不会把小图放大。
内存设置
处理图片时,图片会解码到内存中,占用的内存远大于文件本身。一张 3 MB 的 JPEG 图片处理时可能占用 60 MB 以上,规则复杂或添加水印时更多。PHP 默认的内存限制是 128 MB,处理大图时容易超出。
建议把 PHP 配置文件(php.ini)中的 memory_limit 改为 512M,经常处理大图的可以设为 1G 或更高:
; Maximum amount of memory a script may consume
; https://php.net/memory-limit
memory_limit = 512M 修改后请重启 PHP 和消息队列。
同步和异步的区别
图片处理驱动的「同步处理」开关默认关闭,即异步处理。
- 异步处理:上传成功后立即返回图片链接,图片再进入消息队列处理,处理完成后覆盖原图。不会增加上传耗时,但不能修改输出格式(修改格式会改变文件扩展名和链接)
- 同步处理:上传时就完成处理,返回的已经是处理后的图片。图片较大或规则复杂时,上传耗时会明显增加
异步处理时,队列按以下顺序执行:图片安全审核(如有)→ 图片处理 → 读取 EXIF 信息并生成缩略图 → 到期自动删除(如有)。
输出格式和保存质量
「输出」标签页中可以设置:
- 输出格式:默认「自动」,即保持原格式。可以转换为 jpeg、webp、png、gif、avif、bmp、tiff、jp2、heic,文件扩展名会一起修改。只有开启同步处理时才能设置
- 图片质量:默认 75,取值 0 到 100,数值越大质量越好、文件越大。只对 webp、jpg、jpeg、avif、tiff、jp2、heic 有效
75 已经接近原图的观感,不建议设置到 92 以上,否则文件会明显变大。
重新处理
已经上传的图片可以重新执行图片处理,例如修改了水印后,希望已有图片也用新的水印。重新处理同样会覆盖原图,无法撤销。
- 后台:在「图片管理」页面,单张图片使用「重新处理」操作,多张图片使用「批量重新处理」。可以选择图片处理驱动,留空时使用图片所在储存关联的驱动;所在储存没有关联驱动的图片会被跳过
- 用户端:角色组开启「允许重新执行图片处理」后,用户可以在图片操作栏中点击「重新处理」,一次最多 100 张,使用图片所在储存关联的驱动
- 命令行:执行
php artisan app:handle-photos批量处理,见常用命令
重新处理在消息队列中执行。处理后格式不变、且文件没有被其他图片共用时,图片链接保持不变;转换了格式或文件被共用时,图片会保存到新的路径,链接随之改变。处理完成后,程序会删除不再使用的旧文件、重新生成缩略图,并清除云处理缓存。
