96 lines
2.9 KiB
PHP
96 lines
2.9 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Domain\Media;
|
|
|
|
use App\Framework\DateTime\SystemClock;
|
|
use App\Framework\Ulid\StringConverter;
|
|
use App\Framework\Ulid\Ulid;
|
|
|
|
final readonly class ImageResizer
|
|
{
|
|
public function __construct() {}
|
|
|
|
public function __invoke(
|
|
Image $image,
|
|
int $maxWidth,
|
|
int $maxHeight,
|
|
int $quality = 9
|
|
): ImageVariant
|
|
{
|
|
$sourcePath = $image->path . $image->filename;
|
|
|
|
$filename = str_replace('original', 'thumbnail', $image->filename);
|
|
|
|
$destination = $image->path . $filename;
|
|
|
|
$imageInfo = getimagesize($sourcePath);
|
|
|
|
if($imageInfo === false) {
|
|
throw new \RuntimeException('Could not get image info');
|
|
}
|
|
|
|
$imageType = $imageInfo[2];
|
|
|
|
$source = $this->createImageFromFile($sourcePath, $imageType);
|
|
|
|
$orignalWidth = imagesx($source);
|
|
$orignalHeight = imagesy($source);
|
|
|
|
$scale = min($maxWidth / $orignalWidth, $maxHeight / $orignalHeight);
|
|
|
|
$newWidth = (int)round($orignalWidth * $scale);
|
|
$newHeight = (int)round($orignalHeight * $scale);
|
|
|
|
#$src = imagecreatefrompng($sourcePath);
|
|
$dst = imagecreatetruecolor($newWidth, $newHeight);
|
|
|
|
imagecopyresampled($dst, $source, 0, 0, 0, 0, $newWidth, $newHeight, $orignalWidth, $orignalHeight);
|
|
|
|
$this->saveImage($dst, $destination, $imageType, $quality);
|
|
|
|
imagedestroy($source);
|
|
imagedestroy($dst);
|
|
|
|
$fileSize = filesize($destination);
|
|
|
|
// ULID mit StringConverter in binäres Format konvertieren
|
|
$binaryImageId = $image->ulid;
|
|
|
|
|
|
return new ImageVariant(
|
|
imageId : $binaryImageId,
|
|
variantType: 'thumbnail',
|
|
format : '',
|
|
mimeType : $image->mimeType,
|
|
fileSize : $fileSize,
|
|
width : $newWidth,
|
|
height : $newHeight,
|
|
filename : $filename,
|
|
path: $image->path,
|
|
);
|
|
}
|
|
|
|
|
|
private function createImageFromFile(string $sourcePath, mixed $imageType) {
|
|
return match ($imageType) {
|
|
IMAGETYPE_PNG => imagecreatefrompng($sourcePath),
|
|
IMAGETYPE_JPEG => imagecreatefromjpeg($sourcePath),
|
|
IMAGETYPE_GIF => imagecreatefromgif($sourcePath),
|
|
IMAGETYPE_WEBP => imagecreatefromwebp($sourcePath),
|
|
default => throw new \RuntimeException('Unsupported image type'),
|
|
};
|
|
}
|
|
|
|
private function saveImage($image, string $destination, int $imageType, int $quality): void
|
|
{
|
|
match ($imageType) {
|
|
IMAGETYPE_JPEG => imagejpeg($image, $destination, $quality),
|
|
IMAGETYPE_PNG => imagepng($image, $destination, (int)round(9 - ($quality * 9 / 100))),
|
|
IMAGETYPE_GIF => imagegif($image, $destination),
|
|
IMAGETYPE_WEBP => imagewebp($image, $destination, $quality),
|
|
default => throw new \RuntimeException('Unsupported image type'),
|
|
};
|
|
}
|
|
}
|