diff --git a/src/ios/CDVCamera.m b/src/ios/CDVCamera.m index 6793da45b..9fb6c7336 100644 --- a/src/ios/CDVCamera.m +++ b/src/ios/CDVCamera.m @@ -58,6 +58,9 @@ Licensed to the Apache Software Foundation (ASF) under one } } +static NSString* MIME_PNG = @"image/png"; +static NSString* MIME_JPEG = @"image/jpeg"; + @implementation CDVPictureOptions + (instancetype) createFromTakePictureArguments:(CDVInvokedUrlCommand*)command @@ -372,16 +375,50 @@ - (void)popoverControllerDidDismissPopover:(id)popoverController self.hasPendingOperation = NO; } -- (NSData*)processImage:(UIImage*)image info:(NSDictionary*)info options:(CDVPictureOptions*)options +- (NSString*) getMimeForEncoding:(CDVEncodingType) encoding { + switch (encoding) { + case EncodingTypePNG: return MIME_PNG; + case EncodingTypeJPEG: + default: + return MIME_JPEG; + } +} + +- (NSString*) formatAsDataURI:(NSData*) data withMIME:(NSString*) mime { + NSString* base64 = toBase64(data); + + if (base64 == nil) { + return nil; + } + + return [NSString stringWithFormat:@"data:%@;base64,%@", mime, base64]; +} + +- (NSString*) processImageAsDataUri:(UIImage*) image info:(NSDictionary*) info options:(CDVPictureOptions*) options +{ + NSString* mime = nil; + NSData* data = [self processImage: image info: info options: options outMime: &mime]; + + return [self formatAsDataURI: data withMIME: mime]; +} + +- (NSData*) processImage:(UIImage*) image info:(NSDictionary*) info options:(CDVPictureOptions*) options +{ + return [self processImage:image info: info options: options outMime: nil]; +} + +- (NSData*) processImage:(UIImage*)image info:(NSDictionary*)info options:(CDVPictureOptions*)options outMime:(NSString**) outMime { NSData* data = nil; switch (options.encodingType) { case EncodingTypePNG: data = UIImagePNGRepresentation(image); + if (outMime != nil) *outMime = MIME_PNG; break; case EncodingTypeJPEG: { + if (outMime != nil) *outMime = MIME_JPEG; if ((options.allowsEditing == NO) && (options.targetSize.width <= 0) && (options.targetSize.height <= 0) && (options.correctOrientation == NO) && (([options.quality integerValue] == 100) || (options.sourceType != UIImagePickerControllerSourceTypeCamera))){ // use image unedited as requested , don't resize data = UIImageJPEGRepresentation(image, 1.0); @@ -439,7 +476,8 @@ - (NSData*)processImage:(UIImage*)image info:(NSDictionary*)info options:(CDVPic default: break; }; - + + return data; } @@ -564,9 +602,9 @@ - (void)resultForImage:(CDVPictureOptions*)options info:(NSDictionary*)info comp case DestinationTypeDataUrl: { image = [self retrieveImage:info options:options]; - NSData* data = [self processImage:image info:info options:options]; + NSString* data = [self processImageAsDataUri:image info:info options:options]; if (data) { - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:toBase64(data)]; + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString: data]; } } break; @@ -574,6 +612,7 @@ - (void)resultForImage:(CDVPictureOptions*)options info:(NSDictionary*)info comp { image = [self retrieveImage:info options:options]; NSData* data = [self processImage:image info:info options:options]; + if (data) { if (pickerController.sourceType == UIImagePickerControllerSourceTypePhotoLibrary) { NSMutableData *imageDataWithExif = [NSMutableData data]; @@ -823,7 +862,9 @@ - (void)imagePickerControllerReturnImageResult switch (options.destinationType) { case DestinationTypeDataUrl: { - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:toBase64(self.data)]; + NSString* mime = [self getMimeForEncoding: self.pickerController.pictureOptions.encodingType]; + NSString* uri = [self formatAsDataURI: self.data withMIME: mime]; + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString: uri]; } break; default: // DestinationTypeFileUri