darrynten/pslayers

该软件包最新版本(1.0.5)没有可用的许可证信息。

PHP Imagick 图层

1.0.5 2018-08-17 13:24 UTC

README

Travis Build Status StyleCI Status codecov Packagist Version MIT License

这是一个功能强大且功能齐全的 PHP 库,具有类似 Photoshop 的图像分层、合成、过滤、混合和遮罩功能。

使用 Imagick 和 PHP 7+

简介

我们需要为 buzzbot.ai 提供一种视觉表达方式,因此我们给了她具有 Photoshop 级别的图像管理和操作能力。

这是我们机器人在生成阶段使用的核心软件包。因此,它从底层开始设计,易于使用,同时也允许最大程度的灵活性。

该软件包的核心功能是提供一种简单的方式来分层图像,然后将其组合在一起。

我们提前发布这个版本,因为它做了我们需要的所有事情,但我们忙于其他事情,而且众所周知,不完整但发布比完整但发布更好(更快)。并且我们需要它在 Packagist 上 :)

基本用法

$init = [
    'id' => 12,
    'width' => 100,
    'height' => 100,
];

$pslayers = new Pslayers($init);

单个图层

// Bare minimum for a blank layer
$layerConfig = [
    'id' => 14,
    'width' => 100,
    'height' => 100,
];

$layer = new BlankLayer($layerConfig);

// getting
$width = $layer->width(); // $width = 100

// setting
$layer->width(200); // $width = 200
标准的基类获取器和设置器

将所有的 var/get/set 都使用相同的名称做是很愚蠢的。这已经在待办事项列表中,需要重构。

$layer->width();
$layer->height();
$layer->positionX();
$layer->positionY();
$layer->opacity(); // number between 0 and 1
$layer->composite(); // see notes below
获取图层详细信息

所有图层类实现了一个接口,强制执行方法 getLayerDetailsArray(),该方法返回一个表示图层的数组,每个图层的表示方法各不相同。

有一个辅助方法可以获取此数组的 JSON 表示形式,称为 getLayerDetailsJson(),所有类型的图层都提供了此方法。

设置合成

合成是合成运算符常量,是 Imagick 整数常量。

您可以使用 Imagick::COMPOSITE_DEFAULT 或您想要应用于图层的任何合成运算符来传递。

目前只有一个合成,还不能组合合成。

$layer->composite(Imagick::COMPOSITE_LIGHTEN);

此合成将在渲染堆栈时应用。

图层的集合

// Make a layer
$layer = new BlankLayer($config);

// Add to your Pslayers object
$pslayer->layers->addLayerToCollection($layer);

// Add with foced z-index (destructive, see notes below)
$pslayer->layers->addLayerToCollection($layer, 2);
程序化集合

如果您喜欢,可以创建并操作自己的集合

// Make a collection
$collection = new LayerCollection();

// Add a layer to a collection
$collection->addLayerToCollection($layer);

// Add a layer with a forced z index (destructive, see notes below)
$collection->addLayerToCollection($layer, 1);

渲染

您可以在您的集合上调用 render 方法,它将从索引 0 开始渲染

$pslayers->addLayerToCollection($layer1);
$pslayers->addLayerToCollection($layer2);
$pslayers->addLayerToCollection($layer3);

$pslayers->render();

图层类型

有关标准图层类型的更多信息

空白图层

如上所述,这是最基本但功能最强大的图层。它具有无限的可能性。

您可以与之交互的 canvas 属性是一个功能齐全的 Imagick 类。

尽情发挥吧!

文本图层

允许添加和操作文本

添加了一些额外的文本特定属性

$layer = new TextLayer($config);

$layer->text('text');
$layer->font('/path/to/font');
$layer->fontFamily('Times');
$layer->fontSize(16);
$layer->fontWeight(400);
$layer->fontStretch(\Imagick::STRETCH_ANY);
$layer->fontSize(\Imagick::STYLE_NORMAL);
$layer->underColour('#FFF');
$layer->fillColour('rgba(255, 128, 0, 0.5)');
$layer->fillOpacity(0.1);
$layer->strokeColour('hsl(200, 20, 50)');
$layer->strokeWidth(2);
$layer->strokeOpacity(1.0);
图像图层

目前此功能仅适用于 imageUrl 配置选项。

您可以直接设置图像或使用 BlankLayer 并在该画布上设置图像。

这将得到修复。

渐变图层

目前仅提供从上到下、从左到右、从实色到实色的渐变图层。这将得到扩展。

$layer = new GradientLayer($config);

$layer->startColour('#FFFFFF');
$layer->endColour('#000000');

目前还没有开始、结束或方向

径向渐变图层

$layer = new RadialGradientLayer($config);

$layer->startColour('#FFFFFF');
$layer->endColour('#000000');

与它的表亲一样,它也不是 100% 实现,但它提供了 Imagick 提供的最基本的径向渐变。

实色图层

这是一个纯色图层

$layer = new SolidLayer($config);

$layer->colour('#FFFFFF');
图案图层

这是一个可以平铺标准 Imagick 图案图层。您可以添加可选的缩放和缩放过滤值。

不是 一个平铺图层,它使用标准、低分辨率的内置图案,这些图案随 Imagick 一起提供。

$layer = new PatternLayer($config);

$layer->pattern('bricks');
$layer->scale(2);
$layer->scaleFilter(Imagick::FILTER_BICUBIC);
等离子体图层

生成标准的 Imagick plasma: 风格伪图像。

$layer = new PlasmaLayer($config);
组合图层

这基本上是一个包含另一组图层的层,每个图层都可以有自己的合成树,因此您可以更好地控制图层的合成和操作。

$layer = new GroupLayer($config);

$newTextLayer = new TextLayer($config);
$newGradientLayer = new GradientLayer($config);

$layer->group->addLayerToCollection($newGradientLayer, 1);
$layer->group->addLayerToCollection($newTextLayer, 2);

$layer->render();

这需要在适当的时候触发渲染

合成

这部分的强大功能主要来自于可用的合成功能。

您可以为任何图层添加合成模式,在渲染期间将应用该模式。

请注意,虽然您可以为图层应用多个滤镜,但您只能应用一个合成。如果您想同时实现多个合成混合,可以通过创建一个包含相同图层副本的组图层来实现,并按所需方式合成每个副本。

支持的合成模式

  • 添加 - 图像 + 下方图像
  • 顶部 - 结果与图像形状相同,合成图像在图像形状重叠的地方遮挡图像
  • 混合 - 混合图像
  • 凹凸贴图 - 与乘法相同,但先将源转换为灰度。
  • 颜色加深 - 使目标图像变暗以反映源图像
  • 颜色减淡 - 使目标图像变亮以反映源图像
  • 着色 - 使用合成图像对目标图像进行着色
  • 复制 - 在目标图像上复制源图像
  • 复制黑色 - 从源到目标复制黑色
  • 复制蓝色 - 从源到目标复制蓝色
  • 复制青色 - 从源到目标复制青色
  • 复制绿色 - 从源到目标复制绿色
  • 复制洋红色 - 从源到目标复制洋红色
  • 复制不透明度 - 从源到目标复制不透明度
  • 复制红色 - 从源到目标复制红色
  • 复制黄色 - 从源到目标复制黄色
  • 变暗 - 变暗目标图像
  • 目标顶部 - 目标中位于源内部的区域在源上合成并替换目标
  • 目标内部 - 源内部的区域替换目标
  • 目标外部 - 源外部的区域替换目标
  • 目标覆盖 - 目标替换源
  • 差异 - 从较浅的颜色中减去较深的颜色
  • 位移 - 根据源定义移动目标图像像素
  • 溶解 - 将源溶解到目标中
  • 排除 - 产生类似于差异的效果,但对比度较低
  • 硬光 - 根据源颜色值乘法或遮罩颜色
  • 色调 - 根据源修改目标的色调
  • 合成内部 - 将源合成到目标中
  • 变亮 - 根据源变亮目标
  • 发光 - 根据源发光目标
  • 减去 - 从目标减去源
  • 调节 - 根据源调节目标的亮度、饱和度和色调
  • 乘法 - 将目标乘以源
  • 合成外部 - 将源的外部部分合成到目标上
  • 合成覆盖 - 在目标上合成源
  • 叠加 - 在目标上叠加源
  • 加 - 将源加到目标上
  • 替换 - 用源替换目标
  • 饱和 - 根据源饱和目标
  • 屏幕 - 取源和目标的补数,然后相乘,最后替换目标
  • 柔光 - 根据源变暗或变亮颜色
  • 源顶部 - 源中位于目标内部的区域在目标上合成
  • 源内部 - 源中位于目标内部的区域替换目标
  • 源输出 - 目标外的源部分替换目标
  • 源覆盖 - 源替换目标
  • 减去 - 从目标图像中减去源图像中的颜色
  • 阈值 - 根据源阈值将源组合到目标上
  • XOR - 目标外的源部分与源外的目标部分组合

版本1发布前的待办事项

  • 重构 - 使用相同名称的var/get/set全部移除
  • z-index管理
  • 以下所有参数
  • 以下所有混合/混合模式
  • 以下所有文档

参考精确PS图层混合模式

  • 亮度
  • 对比度
  • 饱和度
  • 色调
  • 色调

变暗

  • 变暗
  • 相乘
  • 色彩烧灼
  • 线性烧灼
  • 较暗的颜色

变亮

  • 变亮
  • 屏幕
  • 色彩跳过
  • 线性跳过(加法)
  • 较亮的颜色

对比度

  • 叠加
  • 柔光
  • 硬光
  • 鲜艳光
  • 线性光
  • 点光
  • 硬混合

反转

  • 差异
  • 排除

取消

  • 减去
  • 除以

组件

  • 色调
  • 饱和度
  • 色彩
  • 亮度

蒙版

未实现

  • 渐变蒙版
  • 透明蒙版

过滤器

支持过滤器

您可以在图层上以类似于将图层组合到集合中的方式组合过滤器 - z-index是数组索引,渲染是按照索引进行的。

标准过滤器

这些是pslayers附带的基本过滤器。

我们设计它们易于扩展和创建,并且如果它们符合要求,我们乐意将新过滤器添加到核心库中。欢迎贡献。

模糊

基本模糊过滤器

$blurFilter = new BlurFilter([
    'id' => 'blur',
    'radius' => 5,                      // required
    'sigma' => 2,                       // required
    'channel' => \Imagik::CHANNEL_ALL,  // optional
]);

$blankLayer = new BlankLayer([
    'id' => 'blank',
    'filters' => [
        $blurFilter,
        // You can combine filters
    ]
])

Fred的过滤器包

我们默认包含了这个包,但如果你想用于除个人使用以外的任何用途,你需要向Fred询问。

这些是我们尽可能安全地实现的Fred Imagick脚本的封装版本。

为了保持一致性,我们不支持这些过滤器中的任何默认值。

我们并未实现所有过滤器,但有一个坚实的基础,这应该使得任何人都能快速添加他的过滤器。

这也意味着你可以封装你喜欢的任何bash脚本,但请明智地使用。我们将只接受经过仔细审查的贡献。

实现的Fred过滤器和使用

彩色玻璃

提供彩色玻璃效果。

文档

$filter = new StainedGlassFilter([
    'id' => 1,
    'kind' => 'random',
    'size' => 50,
    'offset' => 0,
    'ncolors' => 8,
    'bright' => 100,
    'ecolor' => 'black',
    'thick' => 0,
    'rseed' => rand(),
]);

// And then add to a layer

$plasmaLayer = new PlasmaLayer([
    'id' => 'master-layer-plasma-layer',
    'width' => $width,
    'height' => $height,
    'opacity' => 0.8,
    'positionX' => 0,
    'positionY' => 0,
    'composite' => Imagick::COMPOSITE_DARKEN,
    'filters' => [
        $stainedGlassFilter,
    ],
]);

骰子

将图像切成骰子。

文档

$diceFilter = new DiceFilter([
    'id' => 'master-layer-dice-filter',
    'size' => 100,
    'percent' => 100,
    'center' => '10,10',
    'radii' => '0,0',
    'rounding' => '0,0',
]);

其他Fred的过滤器

并非所有过滤器都已添加。如果您添加了过滤器,请通过PR将它们贡献回此项目。

您可以扩展FredBaseFilter并遵循其他模板中的风格。

例如,我们将通过彩色玻璃过滤器的创建来演示 - 您可以在该过滤器的源中跟踪。

使用说明显示开关

USAGE: stainedglass [-k kind] [-s size] [-o offset] [-n ncolors] [-b bright] [-e ecolor] [-t thick] [-r rseed] [-a] infile outfile
USAGE: stainedglass [-h or -help]

-k .... kind ....... kind of stainedglass cell shape; choices are: square 
.................... (or s), hexagon (or h), random (or r); default=random
-s .... size ....... size of cell; integer>0; default=16 
-o .... offset ..... random offset amount; integer>=0; default=6; 
.................... only applies to kind=random
-n .... ncolors .... number of desired reduced colors for the output; 
.................... integer>0; default is no color reduction
-b .... bright ..... brightness value in percent for output image; 
.................... integer>=0; default=100
-e .... ecolor ..... color for edge or border around each cell; any valid 
.................... IM color; default=black
-t .... thick ...... thickness for edge or border around each cell; 
.................... integer>=0; default=1; zero means no edge or border
-r .... rseed ...... random number seed value; integer>=0; if seed provided, 
.................... then image will reproduce; default is no seed, so that 
.................... each image will be randomly different; only applies 
.................... to kind=random
-a ................. use average color of cell rather than color at center 
.................... of cell; default is center color

您将在类的创建中使用这些开关。

至少您需要以下内容

namespace DarrynTen\Pslayers\Filters\Filter\Fred\StainedGlass;

use DarrynTen\Pslayers\Filters\Filter\Fred\FredBaseFilter;

虽然您会在文件中看到所有这些类中都发生了非常严格的验证,但为了本教程的目的,我们不会担心这一点。

接下来,我们扩展包含的基本过滤器并设置命令。

这是如果您在命令行中使用这些过滤器时将要运行的命令。

class StainedGlassFilter extends FredBaseFilter
{
    protected $command = 'stainedglass';

然后我们创建所有开关的映射

    protected $switchMap = [
        'kind' => 'k',
        'size' => 's',
        'offset' => 'o',
        'ncolors' => 'n',
        'bright' => 'b',
        'ecolor' => 'e',
        'thick' => 't',
        'rseed' => 'r',
    ];

这些将在调用基类中render()方法时映射到命令。

您会注意到没有支持-a开关,因为它类似布尔值,但我们还没有添加这种“匿名”开关(不提供值的开关)。

请随意更新基本过滤器以支持此功能。

然后我们为将要由基类在构建时使用的开关映射中的每个条目创建protected变量。

    protected $kind;
    protected $size;
    protected $offset;
    protected $ncolors;
    protected $bright;
    protected $ecolor;
    protected $thick;
    protected $rseed;

这些必须与您上面定义的开关映射中的确切名称完全一致。这一点非常重要。映射到开关的短版本也同样重要。

然后您创建一个构造函数

    public function __construct(array $config)
    {
        // Do your validation here, before you construct the parent

        parent::__construct($config);
    }

然后您就完成了。这就是创建到过滤器映射的全部内容。所有的魔法都在基类fred过滤器中:)

但是请记住,我们没有在上面的示例中包含任何验证或文档块,这些对于新过滤器被接受到项目中来说是必须包含的。对于验证错误,也重要抛出异常(不要返回false,您必须throw)。

致谢