From 158c676dac8f8beedbbac1fd744ddb7eb28c92e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=95=88=EC=84=B8=EC=A2=85?= Date: Sat, 31 Aug 2024 14:08:39 +0900 Subject: [PATCH] Fix: Correct image size calculation for macOS in NSImage --- .../FlutterImageCompressMacosPlugin.swift | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/packages/flutter_image_compress_macos/macos/Classes/FlutterImageCompressMacosPlugin.swift b/packages/flutter_image_compress_macos/macos/Classes/FlutterImageCompressMacosPlugin.swift index 6d2bc95e..22b1ac79 100644 --- a/packages/flutter_image_compress_macos/macos/Classes/FlutterImageCompressMacosPlugin.swift +++ b/packages/flutter_image_compress_macos/macos/Classes/FlutterImageCompressMacosPlugin.swift @@ -267,9 +267,29 @@ class Compressor { func compress(destCreator: () -> CGImageDestination) { let minWidth = CGFloat(params["minWidth"] as! Int) let minHeight = CGFloat(params["minHeight"] as! Int) - - let srcWidth = image.image.size.width - let srcHeight = image.image.size.height + + // NSImage sometimes returns wrong image size. See https://stackoverflow.com/a/9265331/3966361 + + // NSImage size method returns size information that is screen resolution dependent. + // let srcWidth = image.image.size.width + // let srcHeight = image.image.size.height + + // NSImageRep should be used to get the size represented in the actual file image instead. + var srcWidth:CGFloat = 0 + var srcHeight:CGFloat = 0 + + for imageRep in image.image.representations { + let width = CGFloat(imageRep.pixelsWide) + let height = CGFloat(imageRep.pixelsHigh) + + if width > srcWidth { + srcWidth = width + } + + if height > srcHeight { + srcHeight = height + } + } let srcRatio = srcWidth / srcHeight let maxRatio = minWidth / minHeight