UIImagePickerController - пиксельное изображение от слишком быстрого выбора до полной загрузки изображения - PullRequest
1 голос
/ 21 октября 2011

Я использую UIImagePickerController в приложении для iOS, чтобы сохранить изображение в контексте, используя 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 голосов
/ 24 октября 2011

Я предлагаю вам внедрить собственный контроллер вида Crop & Resize.

  1. набор imagePicker.allowsEditing = NO.
  2. создайте свой контроллер вида в - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info и передайте выбранное изображение в свой контроллер представления.
  3. подтолкнуть контроллер вида к средству выбора изображений: [picker pushViewController:yourVC animated:YES]
0 голосов
/ 21 октября 2011

Размер снимка, сделанного камерой iPhone 4, составляет ~ 5 МБ, и для его отображения / визуализации требуется некоторое время. Одним из вариантов является сжатие изображения с использованием UIImageJPEGRepresentation().

Если вы не хотите сжимать изображение, вы можете использовать UIWebView для отображения изображений. У UIWebViewDelegate есть метод - (void)webViewDidFinishLoad:(UIWebView *)webView, который срабатывает после завершения рендеринга. Вы можете включить кнопку выбора в этом методе (который изначально отключен).

...