WedX - журнал о программировании и компьютерных науках

Как я могу получить изображение, снятое с помощью UIImagePickerControllerDelegate с включенным ARC?

У меня есть приложение, которое должно сделать снимок, а затем показать его пользователю. Я открыл камеру, чтобы позволить пользователю сделать снимок, используя следующий код:

if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) {
    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.delegate = self;
    imagePicker.sourceType =
    UIImagePickerControllerSourceTypeCamera;
    imagePicker.mediaTypes = @[(NSString *) kUTTypeImage];
    imagePicker.allowsEditing = NO;
    imagePicker.modalPresentationStyle = UIModalPresentationFullScreen;

    [self presentViewController:imagePicker animated:YES completion:nil];
} else {
    UIAlertView *alert = [[UIAlertView alloc]
                          initWithTitle: @"Camera failed to open"
                          message: @"Camera is not available"
                          delegate: nil
                          cancelButtonTitle:@"OK"
                          otherButtonTitles:nil];
    [alert show];
}

Это представляет вид камеры, чтобы пользователь мог сделать снимок. Я реализовал методы для обработки событий отмены и завершения следующим образом:

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    [self dismissViewControllerAnimated:YES completion:nil];
}

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

    [self dismissViewControllerAnimated:YES completion:nil];

    UIImage * image = [info objectForKey:UIImagePickerControllerEditedImage];
    [photoView setImage:image];
    [photoView setNeedsDisplay];
}

Проблема в том, что после прохождения последней функции изображение равно нулю. Сначала уволитьViewControllerAnimated был в конце функции, но в этом сообщении SO ответ объясняет, что ОтклонитьViewControllerAnimated должен быть вызван первым, а средство выбора должно быть отпущено до получения изображения из информации. Я попытался поместить отклонение ViewControllerAnimated вверху, но, поскольку я использую ARC, я не могу отпустить средство выбора.

Как я могу получить изображение из информации?

10.12.2013

  • Пост предлагает вам блок после завершения увольнения, чтобы получить изображение. ты пробовал? 10.12.2013
  • Используйте свой код для получения изображения перед закрытием контроллера. 10.12.2013

Ответы:


1

Вы установили picker.allowsEditing = NO; в своем коде. Тогда почему вы извлекаете отредактированное изображение? Его не будет. В любом случае, если вы разрешаете редактирование, используйте это:

photoView.image = info[UIImagePickerControllerEditedImage] ? info[UIImagePickerControllerEditedImage] : info[UIImagePickerControllerOriginalImage]

Если пользователь отредактировал фотографию, photoView.image будет установлено на отредактированную фотографию, в противном случае она будет установлена ​​на исходную фотографию.

Если вы не разрешаете редактирование, просто извлеките изображение с помощью клавиши UIImagePickerControllerOriginalImage.

10.12.2013
  • Изображение imagePicker.allowsEditing = NO; нельзя редактировать, поэтому необходимо проверять только исходное изображение. 10.12.2013
  • @selmad Извините, не понял. Что ты имеешь в виду? 10.12.2013
  • @selmad Обновил мой ответ. Спасибо. 10.12.2013
  • Спасибо, это сработало отлично. Вот что я получаю за тупо копипаст из интернета ›‹ 10.12.2013

  • 2

    попробуй это:

    UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
    // or UIImage *image = [info objectForKey:@"UIImagePickerControllerEditedImage"];
    
    10.12.2013

    3

    Проверьте этот метод,

     (void) imagePickerController:(UIImagePickerController *)_picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
          NSLog(@"dictionary image info: %@",info );
        }
    

    В этом методе распечатайте словарь и убедитесь, что вы получаете UIImagePickerControllerMediaType и UIImagePickerControllerOriginalImage. (В моем случае я получаю такое значение: UIImagePickerControllerMediaType = "public.image"; UIImagePickerControllerOriginalImage = UIImage: 0x1dd79520";)

    Теперь, если вы получаете значение для UIImagePickerControllerOriginalImage, вы сохраняете значение в этом UIImage.

    Теперь используйте это.

    UIImage *image = [info objectForKey:@"UIImagePickerControllerEditedImage"];
    

    OR

    UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
    

    Надеюсь, что это поможет вам.

    10.12.2013
    Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]