Skip to content

Commit 5ebd9d8

Browse files
committed
Added Support for custom image manipulators
1 parent 12b3fe2 commit 5ebd9d8

File tree

4 files changed

+94
-69
lines changed

4 files changed

+94
-69
lines changed

src/Contract/ImageManipulator.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
namespace le0daniel\Laravel\ImageEngine\Contract;
4+
5+
use Intervention\Image\Image;
6+
7+
abstract class ImageManipulator
8+
{
9+
abstract public function handle(Image $image): void;
10+
}

src/Image/ImageEngine.php

Lines changed: 22 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
use Illuminate\Support\Str;
1212
use Intervention\Image\Constraint;
1313
use Intervention\Image\ImageManager;
14+
use le0daniel\Laravel\ImageEngine\Contract\ImageManipulator;
15+
use le0daniel\Laravel\ImageEngine\Image\Manipulator\Fit;
16+
use le0daniel\Laravel\ImageEngine\Image\Manipulator\Resize;
1417
use le0daniel\Laravel\ImageEngine\Utility\Directories;
1518
use le0daniel\Laravel\ImageEngine\Utility\Images;
1619
use le0daniel\Laravel\ImageEngine\Utility\Signatures;
@@ -20,16 +23,13 @@ final class ImageEngine
2023
{
2124
private const IMAGE_RESIZE_DIMENSIONS_TO_FIT = 3000;
2225

23-
private array $sizes;
24-
private array $filters = [];
2526
private string $secret;
2627
private string $tmpPath;
2728
private ImageManager $imageManager;
2829

2930
public function __construct(ImageManager $imageManager)
3031
{
3132
$this->imageManager = $imageManager;
32-
$this->sizes = config('image-engine.sizes');
3333
$this->secret = config('image-engine.key');
3434
$this->tmpPath = rtrim(config('image-engine.tmp_directory'), '/');
3535
}
@@ -43,51 +43,21 @@ private function getBasePath(ImageRepresentation $imageRepresentation, bool $for
4343
return rtrim($basePath, '/');
4444
}
4545

46-
/**
47-
* @param string $size
48-
* @return array
49-
* @throws ImageException
50-
*/
51-
private function getSizeArray(string $size): array
46+
private function getConfiguration(string $size): array
5247
{
53-
if (!array_key_exists($size, $this->sizes)) {
54-
throw ImageException::withHint(
55-
'Invalid size.',
56-
"Given {$size}, available: " . implode(', ', array_keys($this->sizes))
57-
);
48+
$configuration = config('image-engine.sizes', [])[$size] ?? null;
49+
if (!$configuration) {
50+
throw ImageException::withHint("Invalid size given: {$size}", 'Please provide a configured size.');
5851
}
5952

6053
return [
61-
$this->sizes[$size][0],
62-
$this->sizes[$size][1],
63-
$this->sizes[$size][2] ?? false,
54+
$configuration[$size][0],
55+
$configuration[$size][1],
56+
$configuration[$size][2] ?? false,
57+
$configuration[$size]['manipulation'] ?? null,
6458
];
6559
}
6660

67-
private function applyFilters(\Intervention\Image\Image $image, string $size)
68-
{
69-
if (!array_key_exists($size, $this->filters)) {
70-
return;
71-
}
72-
73-
/* Loop through filters */
74-
foreach ($this->filters[$size] as $filter => $params) {
75-
/* No params given */
76-
if (is_numeric($filter)) {
77-
$filter = $params;
78-
$params = [];
79-
}
80-
81-
/* Cast single params as array */
82-
if (!is_array($params)) {
83-
$params = [$params];
84-
}
85-
86-
/* Apply filter */
87-
$image->{$filter}(...$params);
88-
}
89-
}
90-
9161
private function getAbsoluteRenderPath(
9262
ImageRepresentation $imageRepresentation,
9363
string $extension,
@@ -132,45 +102,28 @@ public function render(
132102
if (file_exists($absoluteRenderPath)) {
133103
return $absoluteRenderPath;
134104
}
135-
136-
if (!file_exists(dirname($absoluteRenderPath))) {
137-
Directories::makeRecursive(dirname($absoluteRenderPath));
138-
}
105+
Directories::makeRecursive(dirname($absoluteRenderPath));
139106

140107
// Original requested
141108
if (Images::isOriginalSize($imageRepresentation->size)) {
142109
copy(Images::realPath($imageRepresentation), $absoluteRenderPath);
143110
return $absoluteRenderPath;
144111
}
145112

146-
[$x, $y, $fit] = $this->getSizeArray($imageRepresentation->size);
113+
[$x, $y, $fit, $userProvidedManipulators] = $this->getConfiguration($imageRepresentation->size);
147114

148-
$image = $this
149-
->imageManager
150-
->make(Images::realPath($imageRepresentation));
115+
$image = $this->imageManager->make(Images::realPath($imageRepresentation));
151116

152-
/* Resize the image */
153-
if ($fit) {
154-
$image->fit(
155-
$x,
156-
$y,
157-
static function (Constraint $constraint) {
158-
$constraint->upsize();
159-
}
160-
);
161-
} else {
162-
$image->resize(
163-
$x,
164-
$y,
165-
static function (Constraint $constraint) {
166-
$constraint->aspectRatio();
167-
$constraint->upsize();
168-
}
169-
);
117+
$manipulators = [
118+
$fit ? new Fit($x, $y) : new Resize($x, $y),
119+
];
120+
if ($userProvidedManipulators) {
121+
foreach ($userProvidedManipulators as $manipulator) {
122+
$manipulators[] = new $manipulator;
123+
}
170124
}
171125

172-
/* Add Filters */
173-
$this->applyFilters($image, $imageRepresentation->size);
126+
array_walk($manipulators, fn(ImageManipulator $manipulator) => $manipulator->handle($image));
174127

175128
/* Save */
176129
$image->save($absoluteRenderPath);

src/Image/Manipulator/Fit.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
namespace le0daniel\Laravel\ImageEngine\Image\Manipulator;
4+
5+
use Intervention\Image\Constraint;
6+
use Intervention\Image\Image;
7+
use le0daniel\Laravel\ImageEngine\Contract\ImageManipulator;
8+
9+
final class Fit extends ImageManipulator
10+
{
11+
private ?int $x;
12+
private ?int $y;
13+
14+
public function __construct(?int $x, ?int $y)
15+
{
16+
$this->x = $x;
17+
$this->y = $y;
18+
}
19+
20+
public function handle(Image $image): void
21+
{
22+
$image->fit(
23+
$this->x,
24+
$this->y,
25+
static function (Constraint $constraint) {
26+
$constraint->upsize();
27+
}
28+
);
29+
}
30+
}

src/Image/Manipulator/Resize.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
namespace le0daniel\Laravel\ImageEngine\Image\Manipulator;
4+
5+
use Intervention\Image\Constraint;
6+
use Intervention\Image\Image;
7+
use le0daniel\Laravel\ImageEngine\Contract\ImageManipulator;
8+
9+
final class Resize extends ImageManipulator
10+
{
11+
12+
private ?int $x;
13+
private ?int $y;
14+
15+
public function __construct(?int $x, ?int $y)
16+
{
17+
$this->x = $x;
18+
$this->y = $y;
19+
}
20+
21+
public function handle(Image $image): void
22+
{
23+
$image->resize(
24+
$this->x,
25+
$this->y,
26+
static function (Constraint $constraint) {
27+
$constraint->aspectRatio();
28+
$constraint->upsize();
29+
}
30+
);
31+
}
32+
}

0 commit comments

Comments
 (0)