From e064bab7db62c79854c7a5cd970fc2890cf4f01b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Villeneuve?= Date: Fri, 23 Feb 2018 10:12:47 +0100 Subject: [PATCH 1/7] Add width/height options --- .../tasks/ResolveTakenPictureAsyncTask.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/android/src/main/java/org/reactnative/camera/tasks/ResolveTakenPictureAsyncTask.java b/android/src/main/java/org/reactnative/camera/tasks/ResolveTakenPictureAsyncTask.java index e8976de..ba0f444 100644 --- a/android/src/main/java/org/reactnative/camera/tasks/ResolveTakenPictureAsyncTask.java +++ b/android/src/main/java/org/reactnative/camera/tasks/ResolveTakenPictureAsyncTask.java @@ -61,6 +61,9 @@ public class ResolveTakenPictureAsyncTask extends AsyncTask Date: Fri, 23 Feb 2018 14:54:45 +0100 Subject: [PATCH 2/7] Add ability to control size by only specifying width + made orientation optionnal. see #768 --- .../tasks/ResolveTakenPictureAsyncTask.java | 270 +++++++++--------- 1 file changed, 133 insertions(+), 137 deletions(-) diff --git a/android/src/main/java/org/reactnative/camera/tasks/ResolveTakenPictureAsyncTask.java b/android/src/main/java/org/reactnative/camera/tasks/ResolveTakenPictureAsyncTask.java index ba0f444..a2df010 100644 --- a/android/src/main/java/org/reactnative/camera/tasks/ResolveTakenPictureAsyncTask.java +++ b/android/src/main/java/org/reactnative/camera/tasks/ResolveTakenPictureAsyncTask.java @@ -24,18 +24,18 @@ import java.io.FileOutputStream; import java.io.IOException; public class ResolveTakenPictureAsyncTask extends AsyncTask { - private static final String ERROR_TAG = "E_TAKING_PICTURE_FAILED"; - private Promise mPromise; - private byte[] mImageData; - private ReadableMap mOptions; - private File mCacheDirectory; - private Bitmap mBitmap; + private static final String ERROR_TAG = "E_TAKING_PICTURE_FAILED"; + private Promise mPromise; + private byte[] mImageData; + private ReadableMap mOptions; + private File mCacheDirectory; + private Bitmap mBitmap; - public ResolveTakenPictureAsyncTask(byte[] imageData, Promise promise, ReadableMap options) { - mPromise = promise; - mOptions = options; - mImageData = imageData; - } + public ResolveTakenPictureAsyncTask(byte[] imageData, Promise promise, ReadableMap options) { + mPromise = promise; + mOptions = options; + mImageData = imageData; + } public ResolveTakenPictureAsyncTask(byte[] imageData, Promise promise, ReadableMap options, File cacheDirectory) { mPromise = promise; @@ -44,95 +44,97 @@ public class ResolveTakenPictureAsyncTask extends AsyncTask Date: Fri, 23 Feb 2018 16:08:45 +0100 Subject: [PATCH 3/7] Add width property on iOS. Allows to specify an image width on capture --- ios/RN/RNCamera.m | 11 +++++++++++ ios/RN/RNImageUtils.h | 1 + ios/RN/RNImageUtils.m | 27 +++++++++++++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/ios/RN/RNCamera.m b/ios/RN/RNCamera.m index 5a4c1b1..2df76a8 100644 --- a/ios/RN/RNCamera.m +++ b/ios/RN/RNCamera.m @@ -324,6 +324,17 @@ static NSDictionary *defaultFaceDetectorOptions = nil; if ([options[@"mirrorImage"] boolValue]) { takenImage = [RNImageUtils mirrorImage:takenImage]; } +<<<<<<< HEAD +======= + + if ([options[@"width"] integerValue]) { + takenImage = [RNImageUtils scaleImage:takenImage toWidth:[options[@"width"] integerValue]]; + } + + if ([options[@"forceUpOrientation"] boolValue]) { + takenImage = [RNImageUtils forceUpOrientation:takenImage]; + } +>>>>>>> c03db73... Add width property on iOS. Allows to specify an image width on capture NSMutableDictionary *response = [[NSMutableDictionary alloc] init]; float quality = [options[@"quality"] floatValue]; diff --git a/ios/RN/RNImageUtils.h b/ios/RN/RNImageUtils.h index f173809..0191c7e 100644 --- a/ios/RN/RNImageUtils.h +++ b/ios/RN/RNImageUtils.h @@ -15,6 +15,7 @@ + (UIImage *)cropImage:(UIImage *)image toRect:(CGRect)rect; + (UIImage *)mirrorImage:(UIImage *)image; + (NSString *)writeImage:(NSData *)image toPath:(NSString *)path; ++ (UIImage *) scaleImage:(UIImage*)image toWidth:(NSInteger)width; + (void)updatePhotoMetadata:(CMSampleBufferRef)imageSampleBuffer withAdditionalData:(NSDictionary *)additionalData inResponse:(NSMutableDictionary *)response; @end diff --git a/ios/RN/RNImageUtils.m b/ios/RN/RNImageUtils.m index e5d4966..93b0a48 100644 --- a/ios/RN/RNImageUtils.m +++ b/ios/RN/RNImageUtils.m @@ -68,6 +68,33 @@ return [fileURL absoluteString]; } +<<<<<<< HEAD +======= ++ (UIImage *) scaleImage:(UIImage*)image toWidth:(NSInteger)width +{ + width /= [UIScreen mainScreen].scale; // prevents image from being incorrectly resized on retina displays + float scaleRatio = (float) width / (float) image.size.width; + CGSize size = CGSizeMake(width, (int) (image.size.height * scaleRatio)); + + UIGraphicsBeginImageContextWithOptions(size, NO, 0.0); + [image drawInRect:CGRectMake(0, 0, size.width, size.height)]; + UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + return [UIImage imageWithCGImage:[newImage CGImage] scale:1.0 orientation:(newImage.imageOrientation)]; +} + ++ (UIImage *)forceUpOrientation:(UIImage *)image +{ + if (image.imageOrientation != UIImageOrientationUp) { + UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale); + [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)]; + image = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + } + return image; +} + +>>>>>>> c03db73... Add width property on iOS. Allows to specify an image width on capture + (void)updatePhotoMetadata:(CMSampleBufferRef)imageSampleBuffer withAdditionalData:(NSDictionary *)additionalData inResponse:(NSMutableDictionary *)response { CFDictionaryRef exifAttachments = CMGetAttachment(imageSampleBuffer, kCGImagePropertyExifDictionary, NULL); From cc4520d72f1d7a2717f011e8771c5589abc2bd6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Villeneuve?= Date: Fri, 23 Feb 2018 16:11:41 +0100 Subject: [PATCH 4/7] Update documentation with new width property --- docs/RNCamera.md | 2 ++ ios/RN/RNImageUtils.m | 14 -------------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/docs/RNCamera.md b/docs/RNCamera.md index 2f640e9..06bde0f 100644 --- a/docs/RNCamera.md +++ b/docs/RNCamera.md @@ -240,6 +240,8 @@ Takes a picture, saves in your app's cache directory and returns a promise. Supported options: + - `width` (integer). This property allows to specify the width that the returned image should have. If no value is specified the maximum image size is used (capture may take longer). + - `quality` (float between 0 to 1.0). This property is used to compress the output jpeg file with 1 meaning no jpeg compression will be applied. If no value is specified `quality:1` is used. - `base64` (boolean true or false) Use this with `true` if you want a base64 representation of the picture taken on the return data of your promise. If no value is specified `base64:false` is used. diff --git a/ios/RN/RNImageUtils.m b/ios/RN/RNImageUtils.m index 93b0a48..e32a80b 100644 --- a/ios/RN/RNImageUtils.m +++ b/ios/RN/RNImageUtils.m @@ -68,8 +68,6 @@ return [fileURL absoluteString]; } -<<<<<<< HEAD -======= + (UIImage *) scaleImage:(UIImage*)image toWidth:(NSInteger)width { width /= [UIScreen mainScreen].scale; // prevents image from being incorrectly resized on retina displays @@ -83,18 +81,6 @@ return [UIImage imageWithCGImage:[newImage CGImage] scale:1.0 orientation:(newImage.imageOrientation)]; } -+ (UIImage *)forceUpOrientation:(UIImage *)image -{ - if (image.imageOrientation != UIImageOrientationUp) { - UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale); - [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)]; - image = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - } - return image; -} - ->>>>>>> c03db73... Add width property on iOS. Allows to specify an image width on capture + (void)updatePhotoMetadata:(CMSampleBufferRef)imageSampleBuffer withAdditionalData:(NSDictionary *)additionalData inResponse:(NSMutableDictionary *)response { CFDictionaryRef exifAttachments = CMGetAttachment(imageSampleBuffer, kCGImagePropertyExifDictionary, NULL); From 8b26827730abba742090c38693c356ca4abbae77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Villeneuve?= Date: Fri, 23 Feb 2018 16:22:04 +0100 Subject: [PATCH 5/7] Removed conflicts --- ios/RN/RNCamera.m | 7 ------- 1 file changed, 7 deletions(-) diff --git a/ios/RN/RNCamera.m b/ios/RN/RNCamera.m index 2df76a8..5b61d28 100644 --- a/ios/RN/RNCamera.m +++ b/ios/RN/RNCamera.m @@ -324,18 +324,11 @@ static NSDictionary *defaultFaceDetectorOptions = nil; if ([options[@"mirrorImage"] boolValue]) { takenImage = [RNImageUtils mirrorImage:takenImage]; } -<<<<<<< HEAD -======= if ([options[@"width"] integerValue]) { takenImage = [RNImageUtils scaleImage:takenImage toWidth:[options[@"width"] integerValue]]; } - if ([options[@"forceUpOrientation"] boolValue]) { - takenImage = [RNImageUtils forceUpOrientation:takenImage]; - } ->>>>>>> c03db73... Add width property on iOS. Allows to specify an image width on capture - NSMutableDictionary *response = [[NSMutableDictionary alloc] init]; float quality = [options[@"quality"] floatValue]; NSData *takenImageData = UIImageJPEGRepresentation(takenImage, quality); From 2a49ed75cdc5bcc02ca33b2a4306f4d9b5bc80f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Villeneuve?= Date: Fri, 23 Feb 2018 16:25:49 +0100 Subject: [PATCH 6/7] Update documentation with android fixOrientation option --- docs/RNCamera.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/RNCamera.md b/docs/RNCamera.md index 06bde0f..01ffc4f 100644 --- a/docs/RNCamera.md +++ b/docs/RNCamera.md @@ -247,6 +247,8 @@ Supported options: - `base64` (boolean true or false) Use this with `true` if you want a base64 representation of the picture taken on the return data of your promise. If no value is specified `base64:false` is used. - `exif` (boolean true or false) Use this with `true` if you want a exif data map of the picture taken on the return data of your promise. If no value is specified `exif:false` is used. + + - `fixOrientation` (android only, boolean true or false) Use this with `true` if you want to fix incorrect image orientation (can take up to 5 seconds on some devices). Do not provide this if you only need EXIF based orientation. The promise will be fulfilled with an object with some of the following properties: From cc3fb30ab27fed935ec75ef295efce6302d5dc44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Villeneuve?= Date: Mon, 26 Feb 2018 09:31:27 +0100 Subject: [PATCH 7/7] Add more infos on `width` property doc, eventually fixed indent --- .../camera/tasks/ResolveTakenPictureAsyncTask.java | 9 +++------ docs/RNCamera.md | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/android/src/main/java/org/reactnative/camera/tasks/ResolveTakenPictureAsyncTask.java b/android/src/main/java/org/reactnative/camera/tasks/ResolveTakenPictureAsyncTask.java index a2df010..30237b7 100644 --- a/android/src/main/java/org/reactnative/camera/tasks/ResolveTakenPictureAsyncTask.java +++ b/android/src/main/java/org/reactnative/camera/tasks/ResolveTakenPictureAsyncTask.java @@ -62,7 +62,6 @@ public class ResolveTakenPictureAsyncTask extends AsyncTask