2012-04-01 2 views
0

В моем приложении, когда я использую UIImagePickerController, я изменяю размер изображения, взятого из сборщика, чтобы уменьшить его с самого большого размера, с которого он начинается. На iPhone и iPod Touch он отлично работает, и есть небольшое отставание. Однако, поскольку экран iPad намного больше, он занимает MUCH, MUCH больше, так как я изменяю его размер в соответствии с пикселями.Изменение размера UIImage занимает много времени?

Это мой код:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; 
    CGRect screenBounds = [[UIScreen mainScreen] bounds]; 
    CGFloat screenScale = [[UIScreen mainScreen] scale]; 
    CGSize screenSize = CGSizeMake(screenBounds.size.width * screenScale, screenBounds.size.height * screenScale); 

    UIGraphicsBeginImageContext(screenSize); 
    [image drawInRect:CGRectMake(0,0,screenSize.width,screenSize.height)]; 
    newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults]; 
    [currentDefaults setObject:UIImagePNGRepresentation(newImage) forKey:@"newImageKey"]; 
    [currentDefaults synchronize]; 

    [popoverController dismissPopoverAnimated:YES]; 
    [picker dismissModalViewControllerAnimated:YES]; 
} 

Есть ли способ, чтобы изменить его быстрее или сделать его другим способом, так что пользователь не заметит отставание, когда система изменения размера больших изображений?

Спасибо!

ответ

3

В целом, я рекомендую вам две вещи. Во-первых, рассмотрите использование блоков, чтобы сделать операции изменения размера и сохранения с основного потока (для этого требуется iOS 4.0 и выше). Ваш метод будет выглядеть примерно так (с верхней части моей головы и не компилируется)

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    CGRect screenBounds = [[UIScreen mainScreen] bounds]; 
    CGFloat screenScale = [[UIScreen mainScreen] scale]; 
    CGSize screenSize = CGSizeMake(screenBounds.size.width * screenScale, screenBounds.size.height * screenScale); 

    UIGraphicsBeginImageContext(screenSize); 
    [image drawInRect:CGRectMake(0,0,screenSize.width,screenSize.height)]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults]; 
    [currentDefaults setObject:UIImagePNGRepresentation(newImage) forKey:@"newImageKey"]; 
    [currentDefaults synchronize]; 
}); 

[popoverController dismissPopoverAnimated:YES]; 
[picker dismissModalViewControllerAnimated:YES]; 
} 

Вторая вещь, которую я настоятельно рекомендую, чтобы не хранить полученное изображение в NSUserDefaults. NSUserDefaults предназначен только для небольшого хранилища ключей. Если вы собираетесь хранить изображения, храните их на диске с помощью NSFileManager и сохраняйте путь как значение в NSUserDefaults.

+0

Спасибо, что этот код работал отлично, но можете ли вы показать мне пример того, что вы имеете в виду для своего второго совета? –

+0

Также есть способ иметь обратный вызов для dispatch_async, чтобы я мог показать UIAlertView, когда это будет сделано? –

+0

Nevermind, я закончил тем, что нашел ответы на все эти вопросы, так что теперь он отлично работает! –

Смежные вопросы