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 | 71 +++++++++++++++++---------------------------- 1 file changed, 26 insertions(+), 45 deletions(-) diff --git a/src/Model/Photo.php b/src/Model/Photo.php index 2235137be2..f393211548 100644 --- a/src/Model/Photo.php +++ b/src/Model/Photo.php @@ -990,28 +990,21 @@ class Photo } /** - * Tries to resize image to wanted maximum size + * Resize to a given maximum file size * - * @param Image $image Image instance - * @return Image|null Image instance on success, null on error + * @param Image $image + * @param integer $maximagesize + * @return Image */ - private static function fitImageSize(Image $image) + public static function resizeToFileSize(Image $image, int $maximagesize): Image { - $max_length = DI::config()->get('system', 'max_image_length'); - if ($max_length > 0) { - $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) { + 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); @@ -1020,13 +1013,26 @@ class Photo $height = $image->getHeight(); } } - if ($filesize > $maximagesize) { - Logger::notice('Image size is too big', ['size' => $filesize, 'max' => $maximagesize]); - return null; - } } + + return $image; + } - return $image; + /** + * Tries to resize image to wanted maximum size + * + * @param Image $image Image instance + * @return Image|null Image instance on success, null on error + */ + private static function fitImageSize(Image $image) + { + $max_length = DI::config()->get('system', 'max_image_length'); + if ($max_length > 0) { + $image->scaleDown($max_length); + Logger::info('File upload: Scaling picture to new size', ['max-length' => $max_length]); + } + + 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(); -- 2.39.5