darrynten / pslayers
PHP Imagick 图层
Requires
- php: ^7.0
- darrynten/any-cache: ^1.0
- darrynten/imagick-scripts: ~1.0.1
- guzzlehttp/guzzle: ^6.2.1
- symfony/process: ^4.1
Requires (Dev)
- mockery/mockery: dev-master
- phpunit/phpunit: ^7.0
This package is auto-updated.
Last update: 2024-09-09 10:27:54 UTC
README
这是一个功能强大且功能齐全的 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
)。
致谢
- Dmitry Semenov,一如既往。