1

iOSアプリでUIImagePickerControllerを使用して、UIGraphicsBeginImageContext/UIGraphicsBeginImageContextWithOptionsを使用してコンテキスト内の画像を保存しています。

最近、保存して後日表示した画像が非常にピクセル化されていることに気づきました。同じコードで戻って写真を再度インポートすると、すばらしい画像が得られました。デバイスでしばらくこれを試してみたところ、保存される画像の品質は、[移動して拡大縮小]画面の[選択]ボタンを押したときによって異なることがわかりました。

画像が大きい画像で、ボタンを押してもロードされている場合、画像はピクセル化されています...画像がロードされるまで待つと問題ありません。私の質問は、ユーザーが「選択」ボタンを押すタイミングを制御できる方法はありますか?画像が完全に読み込まれるまで待機するように強制する方法はありますか?または、この問題に取り組むためのより良い別の方法はありますか?

- (void)choosePhoto {

    //NSLog(@"%s", __FUNCTION__);
    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.delegate = self;
    imagePicker.allowsEditing = YES;

    imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

    [self presentModalViewController:imagePicker animated:YES];
    [imagePicker release];
}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

    //NSLog(@"%s", __FUNCTION__);
    [self dismissModalViewControllerAnimated:YES];

    UIImage *pickedImage = (UIImage*)[info objectForKey:@"UIImagePickerControllerEditedImage"];
    [self setPersonImage:pickedImage];
}


- (void) setPersonImage:(UIImage *)pickedImage  {

    //NSLog(@"%s", __FUNCTION__);

    NSManagedObjectContext *context = [[UIApplication sharedDelegate] managedObjectContext];
    PersonImage *oldImage = person.image;
    if (oldImage != nil) {
        [context deleteObject:(NSManagedObject*)oldImage];
    }

    if (pickedImage != nil) {
        // Create an image object for the new image.
        PersonImage *newImageObject = [NSEntityDescription insertNewObjectForEntityForName:@"PersonImage" inManagedObjectContext:context];
        [newImageObject setImage:pickedImage]; 
        [person setImage:newImageObject]; 
    }
    else {
        [person setImage:nil];
    }

    NSError *error;
    if (![context save:&error]) {
        exit(-1);  // Fail
    }
}
4

2 に答える 2

0

iPhone4カメラでキャプチャされた画像のサイズは最大5MBで、表示/レンダリングに時間がかかります。1つのオプションは、を使用して画像を圧縮することUIImageJPEGRepresentation()です。

画像を圧縮したくない場合は、UIWebViewを使用して画像を表示できます。には、レンダリングが完了した後にヒットUIWebViewDelegateするメソッドがあります。- (void)webViewDidFinishLoad:(UIWebView *)webViewこの方法で選択ボタンを有効にすることができます(最初は無効になっています)。

于 2011-10-21T05:24:17.037 に答える
0

独自のCrop&Resizeビューコントローラを実装することをお勧めします。

  1. セットimagePicker.allowsEditing = NO
  2. ビューコントローラを作成し、- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info選択した画像をビューコントローラに渡します。
  3. ビューコントローラを画像ピッカーにプッシュします。[picker pushViewController:yourVC animated:YES]
于 2011-10-24T15:49:11.657 に答える