2021-09-06 02:31:27 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace Aweos\Resizer\Classes;
|
|
|
|
|
2021-09-09 19:18:41 +02:00
|
|
|
use Aweos\Resizer\Lib\MediaPath;
|
2021-09-06 02:31:27 +02:00
|
|
|
use Aweos\Resizer\Models\Setting;
|
|
|
|
use Illuminate\Filesystem\FilesystemAdapter;
|
|
|
|
use Illuminate\Support\Collection;
|
|
|
|
use Intervention\Image\ImageManager;
|
|
|
|
use Media\Classes\MediaLibrary;
|
|
|
|
use October\Rain\Resize\Resizer;
|
|
|
|
use Storage;
|
|
|
|
|
|
|
|
class ImageResizer
|
|
|
|
{
|
|
|
|
|
|
|
|
private FilesystemAdapter $disk;
|
|
|
|
private string $uploadDir;
|
|
|
|
private MediaLibrary $media;
|
2021-09-09 19:18:41 +02:00
|
|
|
private MediaPath $file;
|
2021-09-06 02:31:27 +02:00
|
|
|
|
|
|
|
public function __construct(FilesystemAdapter $disk, string $uploadDir, MediaLibrary $media)
|
|
|
|
{
|
|
|
|
$this->disk = $disk;
|
|
|
|
$this->uploadDir = $uploadDir;
|
|
|
|
$this->media = $media;
|
|
|
|
}
|
|
|
|
|
2021-09-09 19:18:41 +02:00
|
|
|
public function generate(MediaPath $file): void
|
2021-09-06 02:31:27 +02:00
|
|
|
{
|
2021-09-09 19:18:41 +02:00
|
|
|
$this->file = $file;
|
|
|
|
$this->disk->put($this->file->versionsPath(), $this->file->get());
|
2021-09-06 02:31:27 +02:00
|
|
|
|
2021-09-09 19:18:41 +02:00
|
|
|
if ($this->file->compressor()->shouldGenerateVersions()) {
|
|
|
|
$this->generateVersions();
|
|
|
|
}
|
2021-09-06 02:31:27 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private function dimensions(): Collection
|
|
|
|
{
|
2021-09-09 19:18:41 +02:00
|
|
|
[$width, $height] = getimagesize($this->file->root());
|
2021-09-06 02:31:27 +02:00
|
|
|
|
|
|
|
return collect(compact('width', 'height'));
|
|
|
|
}
|
|
|
|
|
|
|
|
private function sizes(): Collection
|
|
|
|
{
|
|
|
|
$sizes = Setting::get('sizes');
|
|
|
|
|
|
|
|
return collect(array_column($sizes, 'aspect_ratio'))->map(
|
|
|
|
fn ($ratio) => collect(array_combine(['width', 'height'], explode('x', $ratio))),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
private function possibleSizes(): Collection
|
|
|
|
{
|
|
|
|
$return = collect([]);
|
|
|
|
$ratios = collect();
|
|
|
|
$ratios->push($this->dimensions());
|
|
|
|
$ratios = $ratios->merge($this->sizes());
|
|
|
|
|
|
|
|
foreach (collect(Setting::get('breakpoints'))->push($this->dimensions()->get('width'))->unique() as $size) {
|
|
|
|
foreach ($ratios as $ratio) {
|
|
|
|
$height = $size * $ratio->get('height') / $ratio->get('width');
|
|
|
|
|
|
|
|
$return->push(collect([
|
|
|
|
'width' => round($size),
|
|
|
|
'height' => round($height),
|
|
|
|
]));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return $return;
|
|
|
|
}
|
|
|
|
|
|
|
|
private function generateVersions(): void
|
|
|
|
{
|
|
|
|
foreach ($this->possibleSizes() as $size) {
|
|
|
|
$temp = microtime().'.jpg';
|
|
|
|
|
2021-09-09 19:18:41 +02:00
|
|
|
$r = app(ImageManager::class)->make($this->file->root())
|
2021-09-06 02:31:27 +02:00
|
|
|
->fit($size->get('width'), $size->get('height'), fn ($constraint) => $constraint->upsize())
|
|
|
|
->save($this->disk->path($temp));
|
|
|
|
list($destWidth, $destHeight) = getimagesize($this->disk->path($temp));
|
|
|
|
|
2021-09-09 19:18:41 +02:00
|
|
|
$versionFilename = $this->file->versionsDirPath().
|
2021-09-06 02:31:27 +02:00
|
|
|
'/'.
|
2021-09-09 19:18:41 +02:00
|
|
|
$this->file->filename().
|
2021-09-06 02:31:27 +02:00
|
|
|
'-'.
|
|
|
|
$destWidth.
|
|
|
|
'x'.
|
|
|
|
$destHeight.
|
|
|
|
'.'.
|
2021-09-09 19:18:41 +02:00
|
|
|
$this->file->extension();
|
2021-09-06 02:31:27 +02:00
|
|
|
|
|
|
|
if ($this->disk->exists($versionFilename)) {
|
|
|
|
$this->disk->delete($versionFilename);
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->disk->move($temp, $versionFilename);
|
|
|
|
}
|
2021-09-09 19:18:41 +02:00
|
|
|
|
|
|
|
foreach ($this->file->versions() as $version) {
|
|
|
|
$this->file->compressor()->make($this->disk->path($version->get('path')));
|
|
|
|
}
|
2021-09-06 02:31:27 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|