过滤器
过滤器执行图像转换操作。虽然一些过滤器集定义可能只需要单个过滤器,但更复杂的定义通常需要许多过滤器。可以链接任意数量的过滤器以达到期望的结果。
提示
你可能需要定义你自己的过滤器来满足你应用的特定需求。参考 自定义过滤器部分 获取实现细节。
内置过滤器
提供了许多内置过滤器来满足大多数常见用例。
自定义过滤器
你可以编写你自己的过滤器来执行任何图像转换操作。自定义过滤器需要实现过滤器 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
。
注册它:手动地
如果你想给它一个不同的名称,你需要 配置一个服务 并标记为 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 许可协议获得许可。