Изменение размера UIImage занимает много времени? - PullRequest
0 голосов
/ 01 апреля 2012

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

Это мой код:

- (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];
}

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

Спасибо!

1 Ответ

3 голосов
/ 01 апреля 2012

В общем, я рекомендую вам сделать две вещи.Во-первых, рассмотрите возможность использования блоков для выполнения операций изменения размера и сохранения вне основного потока (для этого требуется 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.

...