【问题标题】:UIImagePickerController pixelated image from choosing too quickly, before image fully loadedUIImagePickerController 在图像完全加载之前选择过快的像素化图像
【发布时间】:2011-10-21 04:55:43
【问题描述】:

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

【问题讨论】:

  • 不清楚您要达到的目标。您是否将应用程序中的图像保存到照片应用程序?您是否使用 WebView/UiImageView 显示图像?
  • 用户从相册中选择图片或拍照。我保存一个缩略图,然后通过核心数据保存完整图像的数据(最高分辨率),后者使用 BLOB 和 imageToDataTransformer。后来,我使用全尺寸图像显示在不同的地方/尺寸。我知道不建议保存在 Core Data 中,但目前是这样。想想手头的像素化问题。
  • 我也有同样的问题。请注意,返回的图像不是全尺寸图像,而是 90x120 的缩略图。

标签: iphone image-processing uiimage uiimagepickercontroller pixelate


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 嗯,好的,谢谢。那么图像选择器交付时没有任何东西吗?我的其他一切都运行良好,此时我真的不想搞砸它!如果必须,我会这样做,但如果它基本上为我工作,似乎应该有一种方法可以在不改变捕获方法的情况下拦截它。
    • 也许如果我在按下按钮后将保存方法设置为时间延迟?只是不确定那会持续多长时间,我想这就是这种方法的问题。延迟不能太短或太长。所以除非我能得到某种不起作用的委托方法..
    • 捕获方法没有改变。您将在 didFinishPickingMedia 中将图像交付给您后对其进行压缩..
    • 我认为问题在于在 didFinishPickingMedia 中传递的图像不完整,因为选择按钮按下得太快了..
    • 我认为这是不可能的。您可以发布与保存图像相关的代码吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多