quazardous / imagestack
PHP 图像服务框架
Requires
- php: ^7.1
- doctrine/cache: ^1.6
- guzzlehttp/guzzle: ^6.2
- imagine/imagine: ^0.6
Requires (Dev)
- ext-gd: *
- ext-imagick: *
- phpunit/phpunit: ^5.0
README
PHP 图像服务框架。
主要目标是提供一个强大的框架,以创建类似于 imagecache / image style 在 Drupal 中的“即时”图像缩略图生成器。
本项目仅包含框架部分。框架采用积木式设计,以便您可以组装自己的图像服务项目并添加特殊积木。
框架集成
安装
composer require quazardous/imagestack
概念
典型流程
这描述了我们想要实现的典型处理过程。
当前端控制器处理图像 HTTP 请求时
- 前端控制器将使用图像路径调用图像栈。
- 图像栈将使用图像后端获取图像。
- 图像栈将应用图像处理器。
- 图像栈将使用存储后端存储图像。
- 图像栈将图像返回给前端控制器。
- 前端控制器将提供图像。
理想情况下,图像文件将被存储,以便下一个 HTTP 请求可以静态提供。
词汇/积木
图像路径
图像的路径,可能来自前端控制器。
见 ImageStack\Api\ImagePathInterface
。
图像
我们愿意提供的图像内容。
见 ImageStack\Api\ImageInterface
。
图像后端
可以提供图像内容的东西。
见 ImageStack\Api\ImageBackendInterface
。
图像处理器
可以修改/转换/优化图像内容的服务。
见 ImageStack\Api\ImageManipulatorInterface
。
存储后端
我们可以存储图像内容的地方。
通常,我们可以将其存储在文件系统上,以便下一个 HTTP 查询可以静态提供。
见 ImageStack\Api\StorageBackendInterface
。
图像栈
冰山一角类。
见 ImageStack\Api\ImageStackInterface
。
用法
代码示例
此伪控制器创建了一个图像栈,它将
- 从
https://images.example.com/backend/
+$path
获取图像 - 使用
jpegtran
优化它 - 在
'/var/www/my/local/image/storage/'
+$path
上存储它 - 提供服务
function myImageController($path) { $stack = new \ImageStack\ImageStack( new \ImageStack\ImageBackend\HttpImageBackend('https://images.example.com/backend/'), new \ImageStack\StorageBackend\FileStorageBackend('/var/www/my/local/image/storage/')); $oim = new \ImageStack\ImageManipulator\OptimizerImageManipulator(); $oim->registerImageOptimizer(new \ImageStack\ImageOptimizer\JpegtranImageOptimizer()); $stack->addImageManipulator($oim); $image = $stack->stackImage(new \ImageStack\ImagePath($path)); return $image->getBinaryContent(); }
实现
图像栈
基本的图像栈。
见 ImageStack\ImageStack
图像后端
文件图像后端
见 ImageStack\ImageBackend\FileImageBackend
HTTP 图像后端
见 ImageStack\ImageBackend\HttpImageBackend
缓存图像后端
在图像后端之前添加一个缓存层。
见 ImageStack\ImageBackend\CacheImageBackend
顺序图像后端
顺序地从图像后端队列中获取图像,并返回第一个匹配项。
参见 ImageStack\ImageBackend\SequentialImageBackend
图像操作器
转换图像操作器
转换图像类型。
参见 ImageStack\ImageManipulator\ConverterImageManipulator
优化图像操作器
优化图像。
参见 ImageStack\ImageManipulator\OptimizerImageManipulator
jpegtran
包装器,参见 ImageStack\ImageOptimizer\JpegtranImageOptimizer
。
pngcrush
包装器,参见 ImageStack\ImageOptimizer\PngcrushImageOptimizer
。
缩略图操作器
使用(路径)规则创建图像缩略图。
参见 ImageStack\ImageManipulator\ThumbnailerImageManipulator
路径模式规则,参见 ImageStack\ImageManipulator\ThumbnailRule\PatternThumbnailRule
您可以将路径模式关联到缩略图格式
use ImageStack\ImageManipulator\ThumbnailerImageManipulator; use Imagine\Gd\Imagine; use ImageStack\ImagePath; use ImageStack\ImageManipulator\ThumbnailRule\PatternThumbnailRule; ... $rules = [ '|^images/styles/big/|' => '<500x300', // resize to fit in 500x300 box '|^images/styles/box/|' => '200x200', // resize/crop to 200x200 box '|^images/styles/list/|' => '100', // resize/crop to 100x100 box '|^images/([0-9]+)x([0-9]+)/|' => function ($matches) { return "{$matches[1]}x{$matches[2]}"; }, // custom resize/crop '|.*|' => false, // trigger an image not found exception if nothing matches ]; $tim = new ThumbnailerImageManipulator(new Imagine()); foreach ($rules as $pattern => $format) { $tim->addThumbnailRule(new PatternThumbnailRule($pattern, $format)); } // this will resize the given image to fit in a 500x300 box $tim->manipulateImage($image, new ImagePath('images/styles/big/photo.jpg')); // this will resize/crop the given image to a 200x200 box $tim->manipulateImage($image, new ImagePath('images/200x150/photo.jpg')); // this will rise a 404 $tim->manipulateImage($image, new ImagePath('bad/path/photo.jpg'));
水印操作器
给图像添加水印。
参见 ImageStack\ImageManipulator\WatermarkImageManipulator
use ImageStack\ImageManipulator\WatermarkImageManipulator; use Imagine\Gd\Imagine; use ImageStack\ImagePath; ... // repeat the watermark $wim = new WatermarkImageManipulator(new Imagine(), '/path/to/little-watermark.png', [ 'repeat' => WatermarkImageManipulator::REPEAT_ALL, ]); $wim->manipulateImage($image, new ImagePath('protected_image.jpg')); // reduce and anchor a big the watermark $wim = new WatermarkImageManipulator(new Imagine(), '/path/to/huge-watermark.png', [ 'reduce' => WatermarkImageManipulator::REDUCE_INSET, 'anchor' => WatermarkImageManipulator::ANCHOR_BOTTOM|WatermarkImageManipulator::ANCHOR_RIGHT, ]); $wim->manipulateImage($image, new ImagePath('protected_image.jpg'));
测试
git clone git@github.com:quazardous/ImageStack.git
cd ./ImageStack
cp tests/config-dist.php tests/config.php
编辑/适配 tests/config.php
。
composer.phar update -dev
phpunit.phar
依赖/支持
针对 PHP 7.1 进行测试。
当前实现使用 Imagine。
您需要 php-gd
、php-gmagick
或 php-imagick
之一。
外部优化器包装器
历史
- 1.5: 在缩略图和水印中添加动画 GIF 支持(仅 Imagick)
- 1.4: 添加优化 gifsicle
- 1.3: 允许后端具有图像操作器
- 1.2: 添加水印
- 1.1: 添加路径规则
- 1.0: 当前版本
- 0.9: 预版本主要是一个从旧项目复制粘贴的原始版本
致谢
许可证
MIT