From bcd59eda46348dcc7dcf6682e6cbf559b4c7792e Mon Sep 17 00:00:00 2001 From: Sergey Ilyevsky Date: Tue, 16 May 2017 12:59:36 +0300 Subject: [PATCH] Fixed size, width and height params on iOS for resized images. Added width and height on Android --- .../com/wix/RNCameraKit/SaveImageTask.java | 8 ++-- .../project.pbxproj | 6 +++ .../ReactNativeCameraKit/CKCompressedImage.h | 18 +++++++ .../ReactNativeCameraKit/CKCompressedImage.m | 48 +++++++++++++++++++ .../ReactNativeCameraKit/CKGalleryManager.m | 38 +++------------ .../CKGalleryViewManager.m | 29 ----------- 6 files changed, 83 insertions(+), 64 deletions(-) create mode 100644 ios/lib/ReactNativeCameraKit/CKCompressedImage.h create mode 100644 ios/lib/ReactNativeCameraKit/CKCompressedImage.m diff --git a/android/src/main/java/com/wix/RNCameraKit/SaveImageTask.java b/android/src/main/java/com/wix/RNCameraKit/SaveImageTask.java index 890e78a..ba26468 100644 --- a/android/src/main/java/com/wix/RNCameraKit/SaveImageTask.java +++ b/android/src/main/java/com/wix/RNCameraKit/SaveImageTask.java @@ -95,12 +95,14 @@ public class SaveImageTask extends AsyncTask { return null; } - private WritableMap createImageInfo(String filePath, String id, String fileName, long fileSize) { + private WritableMap createImageInfo(String filePath, String id, String fileName, long fileSize, int width, int height) { WritableMap imageInfo = Arguments.createMap(); imageInfo.putString("uri", filePath); imageInfo.putString("id", id); imageInfo.putString("name", fileName); imageInfo.putInt("size", (int) fileSize); + imageInfo.putInt("width", width); + imageInfo.putInt("height", height); return imageInfo; } @@ -119,7 +121,7 @@ public class SaveImageTask extends AsyncTask { long fileSize = new File(filePath).length(); cursor.close(); - return createImageInfo(filePath, filePath, fileName, fileSize); + return createImageInfo(filePath, filePath, fileName, fileSize, image.getWidth(), image.getHeight()); } catch (Exception e) { return null; } @@ -230,6 +232,6 @@ public class SaveImageTask extends AsyncTask { Log.d(TAG, "Error accessing file: " + e.getMessage()); imageFile = null; } - return (imageFile != null) ? createImageInfo(Uri.fromFile(imageFile).toString(), imageFile.getAbsolutePath(), fileName, imageFile.length()) : null; + return (imageFile != null) ? createImageInfo(Uri.fromFile(imageFile).toString(), imageFile.getAbsolutePath(), fileName, imageFile.length(), image.getWidth(), image.getHeight()) : null; } } diff --git a/ios/lib/ReactNativeCameraKit.xcodeproj/project.pbxproj b/ios/lib/ReactNativeCameraKit.xcodeproj/project.pbxproj index 91a91b3..453576a 100644 --- a/ios/lib/ReactNativeCameraKit.xcodeproj/project.pbxproj +++ b/ios/lib/ReactNativeCameraKit.xcodeproj/project.pbxproj @@ -17,6 +17,7 @@ 269292831D3B7D6000E07DDF /* CKCameraOverlayView.m in Sources */ = {isa = PBXBuildFile; fileRef = 269292821D3B7D6000E07DDF /* CKCameraOverlayView.m */; }; 269292861D3B81C800E07DDF /* CKOverlayObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 269292851D3B81C800E07DDF /* CKOverlayObject.m */; }; 26F556721D2501C9007B1C11 /* GalleryData.m in Sources */ = {isa = PBXBuildFile; fileRef = 26F556711D2501C9007B1C11 /* GalleryData.m */; }; + A7686BFE1EC9CFEC00959216 /* CKCompressedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = A7686BFD1EC9CFEC00959216 /* CKCompressedImage.m */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -53,6 +54,8 @@ 269292851D3B81C800E07DDF /* CKOverlayObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CKOverlayObject.m; sourceTree = ""; }; 26F556701D2501C9007B1C11 /* GalleryData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GalleryData.h; sourceTree = ""; }; 26F556711D2501C9007B1C11 /* GalleryData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GalleryData.m; sourceTree = ""; }; + A7686BFC1EC9CFEC00959216 /* CKCompressedImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CKCompressedImage.h; sourceTree = ""; }; + A7686BFD1EC9CFEC00959216 /* CKCompressedImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CKCompressedImage.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -87,6 +90,8 @@ children = ( 26550AE41CFC2437007FF2DF /* CKGalleryManager.h */, 26550AE51CFC2437007FF2DF /* CKGalleryManager.m */, + A7686BFC1EC9CFEC00959216 /* CKCompressedImage.h */, + A7686BFD1EC9CFEC00959216 /* CKCompressedImage.m */, 26550AF41CFC7086007FF2DF /* CKCameraManager.h */, 26550AF51CFC7086007FF2DF /* CKCameraManager.m */, 2685AA221CFD89A300E4A446 /* CKCamera.h */, @@ -166,6 +171,7 @@ buildActionMask = 2147483647; files = ( 26550AF61CFC7086007FF2DF /* CKCameraManager.m in Sources */, + A7686BFE1EC9CFEC00959216 /* CKCompressedImage.m in Sources */, 262E42201D183A6B00C82B27 /* CKGalleryCollectionViewCell.m in Sources */, 262564901E6572B300A7B90D /* CKGalleryCustomCollectionViewCell.m in Sources */, 269292861D3B81C800E07DDF /* CKOverlayObject.m in Sources */, diff --git a/ios/lib/ReactNativeCameraKit/CKCompressedImage.h b/ios/lib/ReactNativeCameraKit/CKCompressedImage.h new file mode 100644 index 0000000..958c02b --- /dev/null +++ b/ios/lib/ReactNativeCameraKit/CKCompressedImage.h @@ -0,0 +1,18 @@ +// +// CKCompressedImage.h +// ReactNativeCameraKit +// +// Created by Sergey Ilyevsky on 15/05/2017. +// Copyright © 2017 Wix. All rights reserved. +// + +#import + +@interface CKCompressedImage : NSObject + +- (instancetype)initWithImage:(UIImage *)image imageQuality:(NSString*)imageQuality; + +@property (nonatomic, readonly) UIImage *image; +@property (nonatomic, readonly) NSData *data; + +@end diff --git a/ios/lib/ReactNativeCameraKit/CKCompressedImage.m b/ios/lib/ReactNativeCameraKit/CKCompressedImage.m new file mode 100644 index 0000000..f4fa1f6 --- /dev/null +++ b/ios/lib/ReactNativeCameraKit/CKCompressedImage.m @@ -0,0 +1,48 @@ +// +// CKCompressedImage.m +// ReactNativeCameraKit +// +// Created by Sergey Ilyevsky on 15/05/2017. +// Copyright © 2017 Wix. All rights reserved. +// + +#import "CKCompressedImage.h" + +@implementation CKCompressedImage + +- (instancetype)initWithImage:(UIImage *)image imageQuality:(NSString*)imageQuality +{ + if(self = [super init]) { + CGFloat max = 1200.0f; + if ([imageQuality isEqualToString:@"high"]) { + max = 1200.0f; + } + else if ([imageQuality isEqualToString:@"medium"]) { + max = 800.0f; + } + else { + _image = image; + _data = UIImageJPEGRepresentation(image, 1.0f); + } + float actualHeight = image.size.height; + float actualWidth = image.size.width; + + float imgRatio = actualWidth/actualHeight; + + float newHeight = (actualHeight > actualWidth) ? max : max/imgRatio; + float newWidth = (actualHeight > actualWidth) ? max*imgRatio : max; + + + CGRect rect = CGRectMake(0.0, 0.0, newWidth, newHeight); + UIGraphicsBeginImageContext(rect.size); + [image drawInRect:rect]; + _image = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + _data = UIImageJPEGRepresentation(_image, 0.85f); + } + + return self; +} + + +@end diff --git a/ios/lib/ReactNativeCameraKit/CKGalleryManager.m b/ios/lib/ReactNativeCameraKit/CKGalleryManager.m index 27c472a..c374a1f 100644 --- a/ios/lib/ReactNativeCameraKit/CKGalleryManager.m +++ b/ios/lib/ReactNativeCameraKit/CKGalleryManager.m @@ -14,6 +14,7 @@ #import "CKGalleryManager.h" #import "CKGalleryViewManager.h" +#import "CKCompressedIMage.h" typedef void (^AlbumsBlock)(NSDictionary *albums); @@ -223,14 +224,16 @@ RCT_EXPORT_METHOD(resizeImage:(NSDictionary*)image NSData *data = [NSData dataWithContentsOfURL:url]; UIImage *originalImage = [UIImage imageWithData:data]; - NSData *compressedImageData = [CKGalleryManager compressImage:originalImage imageQuality:quality]; + CKCompressedImage *compressedImage = [[CKCompressedImage alloc] initWithImage:originalImage imageQuality:quality]; - NSURL *temporaryFileURL = [CKCamera saveToTmpFolder:compressedImageData]; + NSURL *temporaryFileURL = [CKCamera saveToTmpFolder:compressedImage.data]; if (temporaryFileURL) { ans[@"uri"] = temporaryFileURL.description; ans[@"name"] = temporaryFileURL.lastPathComponent; - ans[@"size"] = @(data.length); + ans[@"size"] = @(compressedImage.data.length); + ans[@"width"] = @(compressedImage.image.size.width); + ans[@"height"] = @(compressedImage.image.size.height); } } resolve(ans); @@ -413,33 +416,4 @@ RCT_EXPORT_METHOD(deleteTempImage:(NSString*)tempImageURL } -+(NSData *)compressImage:(UIImage *)image imageQuality:(NSString*)imageQuality{ - CGFloat max = 1200.0f; - if ([imageQuality isEqualToString:@"high"]) { - max = 1200.0f; - } - else if ([imageQuality isEqualToString:@"medium"]) { - max = 800.0f; - } - else { - return UIImageJPEGRepresentation(image, 1.0f); - } - float actualHeight = image.size.height; - float actualWidth = image.size.width; - - float imgRatio = actualWidth/actualHeight; - - float newHeight = (actualHeight > actualWidth) ? max : max/imgRatio; - float newWidth = (actualHeight > actualWidth) ? max*imgRatio : max; - - - CGRect rect = CGRectMake(0.0, 0.0, newWidth, newHeight); - UIGraphicsBeginImageContext(rect.size); - [image drawInRect:rect]; - UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); - NSData *imageData = UIImageJPEGRepresentation(img, 0.85f); - UIGraphicsEndImageContext(); - return imageData; -} - @end diff --git a/ios/lib/ReactNativeCameraKit/CKGalleryViewManager.m b/ios/lib/ReactNativeCameraKit/CKGalleryViewManager.m index f5d7c0f..7b35cfd 100644 --- a/ios/lib/ReactNativeCameraKit/CKGalleryViewManager.m +++ b/ios/lib/ReactNativeCameraKit/CKGalleryViewManager.m @@ -657,33 +657,4 @@ RCT_EXPORT_METHOD(modifyGalleryViewContentOffset:(NSDictionary*)params) { } -+(UIImage *)compressImage:(UIImage *)image imageQuality:(NSString*)imageQuality{ - CGFloat max = 1200.0f; - if ([imageQuality isEqualToString:@"high"]) { - max = 1200.0f; - } - else if ([imageQuality isEqualToString:@"medium"]) { - max = 800.0f; - } - else { - return image; - } - float actualHeight = image.size.height; - float actualWidth = image.size.width; - - float imgRatio = actualWidth/actualHeight; - - float newHeight = (actualHeight > actualWidth) ? max : max*(actualWidth/actualHeight); - float newWidth = (actualHeight > actualWidth) ? max*(actualWidth/actualHeight) : max; - - - CGRect rect = CGRectMake(0.0, 0.0, newWidth, newHeight); - UIGraphicsBeginImageContext(rect.size); - [image drawInRect:rect]; - UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - return img; -} - - @end