UIImagePickerController像素化图像选择太快,图像完全加载之前

时间:2011-10-21 04:55:43

标签: iphone image-processing uiimage uiimagepickercontroller pixelate

我在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
    }
}

2 个答案:

答案 0 :(得分:0)

iPhone 4相机拍摄的图像大小约为5 MB,显示/渲染图像需要一段时间。一种选择是使用UIImageJPEGRepresentation()压缩图像。

如果您不想压缩图像,可以使用UIWebView显示图像。 UIWebViewDelegate有一个方法- (void)webViewDidFinishLoad:(UIWebView *)webView,在渲染完成后点击。您可以在此方法中启用选择按钮(最初禁用)。

答案 1 :(得分:0)

我建议你实现自己的Crop& Resize视图控制器。

  1. 设置imagePicker.allowsEditing = NO
  2. - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info中创建视图控制器,并将所选图像传递给视图控制器。
  3. 将视图控制器推送到图像选取器:[picker pushViewController:yourVC animated:YES]