From d1a1bd93a4104bc576201696b45fe9e7f683100b Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Mon, 24 Sep 2012 18:17:45 +0200 Subject: [PATCH] Improve chat image compression --- Classes/ChatRoomViewController.m | 76 ++++++++++++++--------------- Classes/ImagePickerViewController.m | 2 +- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/Classes/ChatRoomViewController.m b/Classes/ChatRoomViewController.m index ba859ffda..8f934f7e8 100644 --- a/Classes/ChatRoomViewController.m +++ b/Classes/ChatRoomViewController.m @@ -57,7 +57,7 @@ self->imageSharing = NULL; self->listTapGestureRecognizer = [[UITapGestureRecognizer alloc] init]; self->imageQualities = [[OrderedDictionary alloc] initWithObjectsAndKeys: - [NSNumber numberWithFloat:1.0], NSLocalizedString(@"Minimum", nil), + [NSNumber numberWithFloat:0.9], NSLocalizedString(@"Minimum", nil), [NSNumber numberWithFloat:0.5], NSLocalizedString(@"Average", nil), [NSNumber numberWithFloat:0.0], NSLocalizedString(@"Maximum", nil), nil]; } @@ -329,30 +329,53 @@ static void message_status(LinphoneChatMessage* msg,LinphoneChatMessageState sta return TRUE; } -- (void)chooseImageQuality:(UIImage*)image url:(NSURL*)url { - DTActionSheet *sheet = [[DTActionSheet alloc] initWithTitle:NSLocalizedString(@"Choose the compression", nil)]; +- (void)saveAndSend:(UIImage*)image url:(NSURL*)url { + if(url == nil) { + [waitView setHidden:FALSE]; + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + [[LinphoneManager instance].photoLibrary writeImageToSavedPhotosAlbum:image.CGImage + metadata:nil + completionBlock:^(NSURL *assetURL, NSError *error){ + dispatch_async(dispatch_get_main_queue(), ^{ + [waitView setHidden:TRUE]; + if (error) { + [LinphoneLogger log:LinphoneLoggerError format:@"Cannot save image data downloaded [%@]", [error localizedDescription]]; + + UIAlertView* errorAlert = [UIAlertView alloc]; + [errorAlert initWithTitle:NSLocalizedString(@"Transfer error", nil) + message:NSLocalizedString(@"Cannot write image to photo library", nil) + delegate:nil + cancelButtonTitle:NSLocalizedString(@"Ok",nil) + otherButtonTitles:nil ,nil]; + [errorAlert show]; + [errorAlert release]; + return; + } + [LinphoneLogger log:LinphoneLoggerLog format:@"Image saved to [%@]", [assetURL absoluteString]]; + [self chatRoomStartImageUpload:image url:assetURL]; + }); + }]; + }); + } else { + [self chatRoomStartImageUpload:image url:url]; + } +} + +- (void)chooseImageQuality:(UIImage*)original_image url:(NSURL*)url { [waitView setHidden:FALSE]; + DTActionSheet *sheet = [[DTActionSheet alloc] initWithTitle:NSLocalizedString(@"Choose the compression", nil)]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + UIImage *image = [original_image normalizedImage]; for(NSString *key in [imageQualities allKeys]) { - NSAutoreleasePool *p = [[NSAutoreleasePool alloc] init]; NSNumber *number = [imageQualities objectForKey:key]; NSData *data = UIImageJPEGRepresentation(image, [number floatValue]); NSNumber *size = [NSNumber numberWithInteger:[data length]]; NSString *text = [NSString stringWithFormat:@"%@ (%@)", key, [size toHumanReadableSize]]; [sheet addButtonWithTitle:text block:^(){ - [waitView setHidden:FALSE]; - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - NSData *data = UIImageJPEGRepresentation(image, [number floatValue]); - dispatch_async(dispatch_get_main_queue(), ^{ - [waitView setHidden:TRUE]; - [self chatRoomStartImageUpload:[UIImage imageWithData:data] url:url]; - }); - }); + [self saveAndSend:[UIImage imageWithData:data] url:url]; }]; - - [p drain]; } dispatch_async(dispatch_get_main_queue(), ^{ [waitView setHidden:TRUE]; @@ -620,31 +643,8 @@ static void message_status(LinphoneChatMessage* msg,LinphoneChatMessageState sta } } - image = [image normalizedImage]; NSURL *url = [info valueForKey:UIImagePickerControllerReferenceURL]; - if(url != nil) { - [self chooseImageQuality:image url:url]; - } else { - [[LinphoneManager instance].photoLibrary writeImageToSavedPhotosAlbum:image.CGImage - metadata:nil - completionBlock:^(NSURL *assetURL, NSError *error){ - if (error) { - [LinphoneLogger log:LinphoneLoggerError format:@"Cannot save image data downloaded [%@]", [error localizedDescription]]; - - UIAlertView* errorAlert = [UIAlertView alloc]; - [errorAlert initWithTitle:NSLocalizedString(@"Transfer error", nil) - message:NSLocalizedString(@"Cannot write image to photo library", nil) - delegate:nil - cancelButtonTitle:NSLocalizedString(@"Ok",nil) - otherButtonTitles:nil ,nil]; - [errorAlert show]; - [errorAlert release]; - return; - } - [LinphoneLogger log:LinphoneLoggerLog format:@"Image saved to [%@]", [assetURL absoluteString]]; - [self chooseImageQuality:image url:assetURL]; - }]; - } + [self chooseImageQuality:image url:url]; } diff --git a/Classes/ImagePickerViewController.m b/Classes/ImagePickerViewController.m index 29530f27c..73d533731 100644 --- a/Classes/ImagePickerViewController.m +++ b/Classes/ImagePickerViewController.m @@ -177,6 +177,7 @@ static UICompositeViewDescription *compositeDescription = nil; #pragma mark - UIImagePickerControllerDelegate Functions - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { + [self dismiss]; UIImage *image = [info objectForKey:UIImagePickerControllerEditedImage]; if(image == nil) { image = [info objectForKey:UIImagePickerControllerOriginalImage]; @@ -184,7 +185,6 @@ static UICompositeViewDescription *compositeDescription = nil; if(image != nil && imagePickerDelegate != nil) { [imagePickerDelegate imagePickerDelegateImage:image info:info]; } - [self dismiss]; } - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {