2012-04-01 15 views
0

私のアプリでは、UIImagePickerControllerを使用するときにピッカーから取り込んだ画像のサイズを変更して、それが始まる非常に大きなサイズから縮小します。 iPhoneとiPod Touchではうまく動作し、マイナーなラグがあります。しかし、iPadの画面がはるかに大きいので、ピクセルに応じてサイズを変更してからずっと長くなります。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

一般に私がお勧めする2つのことがあります。最初に、ブロックを使用してサイズ変更と保存操作をメインスレッドから行うことを検討してください(これにはiOS 4.0以降が必要です)。あなたの方法は、私は強くお勧めします二つ目はNSUserDefaultsが得られた画像を保存しないことです。この(コンパイル私の頭の上からではなく)

- (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は小規模なKey-Valueストアのみを対象としています。画像を保存する場合は、NSFileManagerを使用して画像をディスクに保存し、パスをNSUserDefaultsの値として保存します。

+0

コードはうまく機能しましたが、2番目のヒントの意味の例を教えてください。 –

+0

また、dispatch_asyncのコールバックがあるので、UIAlertViewを表示することができます。 –

+0

問題がないので、これらすべての質問に対する回答が見つかりました。 –

関連する問題