From 794378ed295a03230539757fe72a5d0cfb40ec9e Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 10 Aug 2023 21:12:35 +0000 Subject: [PATCH] New function to resize an image to not exceed a given file size --- src/Model/Photo.php | 83 +++++++++++++++++---------------------------- 1 file changed, 32 insertions(+), 51 deletions(-) diff --git a/src/Model/Photo.php b/src/Model/Photo.php index 2235137be..f39321154 100644 --- a/src/Model/Photo.php +++ b/src/Model/Photo.php @@ -989,6 +989,35 @@ class Photo return DBA::exists('photo', ['resource-id' => $guid]); } + /** + * Resize to a given maximum file size + * + * @param Image $image + * @param integer $maximagesize + * @return Image + */ + public static function resizeToFileSize(Image $image, int $maximagesize): Image + { + $filesize = strlen($image->asString()); + $width = $image->getWidth(); + $height = $image->getHeight(); + + if ($maximagesize && ($filesize > $maximagesize)) { + // Scale down to multiples of 640 until the maximum size isn't exceeded anymore + foreach ([5120, 2560, 1280, 640, 320] as $pixels) { + if (($filesize > $maximagesize) && (max($width, $height) > $pixels)) { + Logger::info('Resize', ['size' => $filesize, 'width' => $width, 'height' => $height, 'max' => $maximagesize, 'pixels' => $pixels]); + $image->scaleDown($pixels); + $filesize = strlen($image->asString()); + $width = $image->getWidth(); + $height = $image->getHeight(); + } + } + } + + return $image; + } + /** * Tries to resize image to wanted maximum size * @@ -1002,31 +1031,8 @@ class Photo $image->scaleDown($max_length); Logger::info('File upload: Scaling picture to new size', ['max-length' => $max_length]); } - - $filesize = strlen($image->asString()); - $width = $image->getWidth(); - $height = $image->getHeight(); - - $maximagesize = Strings::getBytesFromShorthand(DI::config()->get('system', 'maximagesize')); - - if ($maximagesize && ($filesize > $maximagesize)) { - // Scale down to multiples of 640 until the maximum size isn't exceeded anymore - foreach ([5120, 2560, 1280, 640] as $pixels) { - if (($filesize > $maximagesize) && (max($width, $height) > $pixels)) { - Logger::info('Resize', ['size' => $filesize, 'width' => $width, 'height' => $height, 'max' => $maximagesize, 'pixels' => $pixels]); - $image->scaleDown($pixels); - $filesize = strlen($image->asString()); - $width = $image->getWidth(); - $height = $image->getHeight(); - } - } - if ($filesize > $maximagesize) { - Logger::notice('Image size is too big', ['size' => $filesize, 'max' => $maximagesize]); - return null; - } - } - - return $image; + + return self::resizeToFileSize($image, Strings::getBytesFromShorthand(DI::config()->get('system', 'maximagesize'))); } /** @@ -1237,32 +1243,7 @@ class Photo */ public static function storeWithPreview(Image $image, int $uid, string $resource_id, string $filename, int $filesize, string $album, string $description, string $allow_cid, string $allow_gid, string $deny_cid, string $deny_gid): int { - if ($filesize == 0) { - $filesize = strlen($image->asString()); - } - - $width = $image->getWidth(); - $height = $image->getHeight(); - - $maximagesize = Strings::getBytesFromShorthand(DI::config()->get('system', 'maximagesize')); - - if ($maximagesize && $filesize > $maximagesize) { - // Scale down to multiples of 640 until the maximum size isn't exceeded anymore - foreach ([5120, 2560, 1280, 640, 320] as $pixels) { - if ($filesize > $maximagesize && max($width, $height) > $pixels) { - DI::logger()->info('Resize', ['size' => $filesize, 'width' => $width, 'height' => $height, 'max' => $maximagesize, 'pixels' => $pixels]); - $image->scaleDown($pixels); - $filesize = strlen($image->asString()); - $width = $image->getWidth(); - $height = $image->getHeight(); - } - } - - if ($filesize > $maximagesize) { - DI::logger()->notice('Image size is too big', ['size' => $filesize, 'max' => $maximagesize]); - return -1; - } - } + $image = self::resizeToFileSize($image, Strings::getBytesFromShorthand(DI::config()->get('system', 'maximagesize'))); $width = $image->getWidth(); $height = $image->getHeight();