flaviovs / yii2-imagefilter
为Yii2提供的自动图像过滤功能
Requires
- php: >=5.4.0
- yiisoft/yii2: ^2.0.0
Suggests
- flaviovs/yii2-imagefilters: Image filters for Yii2 Imagefilter
README
Yii2 Imagefilter 扩展提供了一个自动转换和生成(过滤)图像文件的机制。例如,您可以定义一个名为 "thumbnail-100" 的管道,并向其中添加一个过滤器,将图像转换为 100px 的小缩略图。当首次访问管道图像 URL 时,Yii2 Imagefilter 将应用所有配置的管道过滤器,然后保存并输出图像。在配置正确的 Web 服务器软件(例如 nginx、Apache 等)上,下次访问图像 URL 时,将直接提供文件,无需任何 PHP/Yii2 负载。
重要:处理后的图像将保存到您的 @webroot 中,因此您的 Web 服务器应配置为直接提供现有文件。此外,此扩展需要在您的 Yii2 URL 管理器配置中启用 enablePrettyUrl。有关更多信息,请参阅 https://yiiframework.cn/doc/guide/2.0/en/runtime-routing#using-pretty-urls。
用法
-
在您的 Yii2 应用程序中配置
imagefilter组件。这通常意味着编辑@app\config\web.php并包含以下行'components' => [ // (...) 'imagefilter' => [ 'class' => \fv\yii\imagefilter\Component::class, 'pipelines' => [ 'thumbnail-100' => [ 'filters' => [ [ 'class' => 'app\filters\Scale', 'width' => 100, 'height' => 100, ], ], ], ], ], // (...) ]
注意,您可以在单个管道中拥有多个过滤器。多个过滤器将按配置顺序应用。
有关创建图像过滤器的信息,请参阅下面的 创建过滤器。
-
将图像过滤器操作添加到您的控制器之一。例如,您可以创建一个如下所示的控制器
namespace app\controllers; class ImageController extends \yii\web\Controller { public function actions() { return [ 'filter' => \fv\yii\imagefilter\Action::class, ]; } }
-
配置一个 URL 规则,指向您在上一步骤中创建的 Imagefilter 操作
'urlManager' => [ // (...) 'rules' => [ // (...) 'assets/img/<pipeline>/<version>/<src:.+>' => 'image/filter', // (...) ], ],
-
使用
imagefilter组件生成图像的 URL。要生成 URL,请调用
$app->imagefilter->url()$app->imagefilter->url('thumbnail-100', '/img/foobar.png')
调用
$app->imagefilter->img()生成完整的<img>标签$app->imagefilter->img('thunbnail-100', '/img/foobar.png', ['alt' => 'Foo bar']);
注意:URL 路径和选项数组的使用方式与 \yii\helpers\Html::img() 相同。
创建过滤器
过滤器由实现 fv\yii\imagefilter\Filter 接口的 PHP 类定义
class MyFilter extends \yii\base\BaseObject implements \fv\yii\imagefilter\Filter { public $width; public $height; public function filterImage($src, $dest) { \yii\imagine\Image::thumbnail($src, $this->width, $this->height) ->save($dest); } }
单独的 Yii2 Imagefilters 扩展(注意:复数)包含一些为 Yii2 Imagefilter 准备好的过滤器。
管道版本控制
每个管道都可以有一个版本(默认 "0")。版本用于生成最终的、过滤后的图像 URL。这允许您通过仅更改管道版本来强制浏览器在下次请求时加载新图像。这还允许您对图像文件实现非常积极的缓存(例如,您可以指示您的 Web 服务器生成 HTTP 缓存头,这些头在将来很久才会过期)。
示例
'standard-watermark' => [ 'filters' => [ [ 'class' => 'app\filters\Scale', 'width' => 400, 'height' => 400, ], [ 'class' => 'app\filters\AddWatermark', 'text' => 'My Image', 'fontSize' => 10, 'x' => -1, 'y' => -1, ], ], ]
由于没有指定版本,此管道被分配了版本 "0"(您可以通过查看过滤图像的 URL 来检查此版本,URL 应该像 /assets/img/standard-watermark/0/img/my-image.png -- 注意路径中的 "0" 是第四个元素)。
现在假设您已将水印字体大小从 10 像素更改为 12 像素。要强制浏览器加载新图像,只需更改管道版本
'standard-watermark' => [ 'version' => '1', // Force a new version 'filters' => [ // (...) [ // (...) 'fontSize' => 12, // (...) ], ], ]
注意
-
扩展永远不会从您的
@webroot中删除旧版本。您应手动完成此操作。 -
另一种强制浏览器获取新过滤图像的方法是简单地删除对应于当前版本的目录。这将强制 Yii2 Imagefilter 重新生成新图像。