quazardous/imagestack

PHP 图像服务框架

1.5.5 2021-01-21 12:06 UTC

This package is auto-updated.

Last update: 2024-09-21 20:41:13 UTC


README

PHP 图像服务框架。

主要目标是提供一个强大的框架,以创建类似于 imagecache / image styleDrupal 中的“即时”图像缩略图生成器。

本项目仅包含框架部分。框架采用积木式设计,以便您可以组装自己的图像服务项目并添加特殊积木。

框架集成

安装

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-gdphp-gmagickphp-imagick 之一。

外部优化器包装器

历史

  • 1.5: 在缩略图和水印中添加动画 GIF 支持(仅 Imagick)
  • 1.4: 添加优化 gifsicle
  • 1.3: 允许后端具有图像操作器
  • 1.2: 添加水印
  • 1.1: 添加路径规则
  • 1.0: 当前版本
  • 0.9: 预版本主要是一个从旧项目复制粘贴的原始版本

致谢

quazardous.

许可证

MIT