跳到内容

过滤器

编辑此页

过滤器执行图像转换操作。虽然一些过滤器集定义可能只需要单个过滤器,但更复杂的定义通常需要许多过滤器。可以链接任意数量的过滤器以达到期望的结果。

提示

你可能需要定义你自己的过滤器来满足你应用的特定需求。参考 自定义过滤器部分 获取实现细节。

自定义过滤器

你可以编写你自己的过滤器来执行任何图像转换操作。自定义过滤器需要实现过滤器 LoaderInterface (不要与 Liip\ImagineBundle\Binary\Loader 命名空间中的数据加载器接口混淆)

1
2
3
4
5
6
namespace Liip\ImagineBundle\Imagine\Filter\Loader;

interface LoaderInterface
{
    public function load(ImageInterface $image, array $options = []);
}

LoaderInterface 具有方法 load,该方法被提供 ImageInterface 的实例和选项数组。它必须返回一个 ImageInterface

注册它:自动地

默认情况下,你的过滤器将自动注册,因为它实现了 LoaderInterface

当在你的配置中定义过滤器集时,你将能够通过使用其完全限定类名来引用和使用你的自定义过滤器。

注册它:手动地

如果你想给它一个不同的名称,你需要 配置一个服务 并标记为 liip_imagine.filter.loader

要将过滤器 App\Service\MyCustomFilter 注册为 my_custom_filter,请使用以下配置

1
2
3
4
5
6
7
# app/config/services.yml

services:
    app.filter.my_custom_filter:
        class: App\Service\MyCustomFilter
        tags:
            - { name: "liip_imagine.filter.loader", loader: my_custom_filter }

你现在可以在你的配置中定义过滤器集时引用和使用你的自定义过滤器

1
2
3
4
5
6
7
# app/config/config.yml

liip_imagine:
    filter_sets:
        my_special_style:
            filters:
                my_custom_filter: { }

动态过滤器

可以通过将配置作为第三个参数传递给 applyFilter,来动态修改将应用于图像的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
namespace App\Service;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Liip\ImagineBundle\Imagine\Cache\CacheManager;
use Liip\ImagineBundle\Imagine\Data\DataManager;
use Liip\ImagineBundle\Imagine\Filter\FilterManager;

class ImageService
{
    private $cacheManager;
    private $dataManager;
    private $filterManager;

    public function __construct(CacheManager $cacheManager, DataManager $dataManager, FilterManager $filterManager) {
        $this->cacheManager  = $cacheManager;
        $this->dataManager   = $dataManager;
        $this->filterManager = $filterManager;
    }

    public function filter(int $width, int $height) {
        $filter = '...'; // Name of the `filter_set` in `config/packages/liip_imagine.yaml`
        $path = '...'; // Path of the image, relative to `/public/`

        if (!$this->cacheManager->isStored($path, $filter)) {
            $binary = $this->dataManager->find($filter, $path);

            $filteredBinary = $this->filterManager->applyFilter($binary, $filter, [
                'filters' => [
                    'thumbnail' => [
                        'size' => [$width, $height]
                    ]
                ]
            ]);

            $this->cacheManager->store($filteredBinary, $path, $filter);
        }
        return new RedirectResponse($this->cacheManager->resolve($path, $filter), Response::HTTP_MOVED_PERMANENTLY);
    }
}
本作品,包括代码示例,根据 Creative Commons BY-SA 3.0 许可协议获得许可。
目录
    版本