Извлечение последнего изображения, снятого через камеру iPhone

Я пытаюсь получить изображение, которое было снято камерой в iPhone, программно. Теперь проблема в том, что я использую AVCaptureInput и другие заголовки AVFoundation и получаю доступ к камере iPhone вместо простого UIImagePickerViewController, потому что программе необходимо небольшое представление внутри основного представления, показывающее кадры камеры. Итак, проблема в том, что мне нужно получить последнее захваченное изображение. Он хранится в папке камеры в библиотеке. Мне нужно показать это как предварительный просмотр последнего захваченного изображения - точно так же, как камера iPhone.

2 ответа

Решение

Вы можете использовать AssetsLibrary рамки для доступа к фотографиям в камере ролл.

Примерно так должно получиться, чтобы получить последнее изображение в виде эскиза:

- (void)updateLastPhotoThumbnail
{
    [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
        NSInteger numberOfAssets = [group numberOfAssets];
        if (numberOfAssets > 0) {
            NSInteger lastIndex = numberOfAssets - 1;
            [group enumerateAssetsAtIndexes:[NSIndexSet indexSetWithIndex:lastIndex] options:0 usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
                UIImage *thumbnail = [UIImage imageWithCGImage:[result thumbnail]];
                if (thumbnail && thumbnail.size.width > 0) {
                    photoThumbnailView.image = thumbnail;
                    *stop = YES;
                }
            }];
        }
    } failureBlock:^(NSError *error) {
        NSLog(@"error: %@", error);
    }];
}

Это предполагает, что у вас есть assetsLibrary, инициализированный как переменная экземпляра. Затем вы также можете наблюдать уведомление, которое публикуется при изменении библиотеки (также может происходить за пределами вашего приложения):

assetsLibrary = [[ALAssetsLibrary alloc] init];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateLastPhotoThumbnail) name:ALAssetsLibraryChangedNotification object:nil];

По некоторым причинам выше ответ не работает для меня.

Я получил это с помощью этого кода.

galleryButton - это переменная экземпляра для uibutton.

- (void)createGalleryButton
{
    NSMutableArray *assets = [[NSMutableArray alloc] init];
    void (^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger
                                                               index, BOOL *stop) {
        if(result != nil) {
            UIImage *thumbnail = [UIImage imageWithCGImage:[result thumbnail]];
            [assets addObject:thumbnail];
        }
    };

    void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop) {
        if(group != nil) {
            [group setAssetsFilter:[ALAssetsFilter allPhotos]];
            [group enumerateAssetsUsingBlock:assetEnumerator];
        }

        if(assets.count!=0)
        {
            UIImage *lastImage = (UIImage *)[assets lastObject];
            [self.galleryButton setImage:lastImage forState:UIControlStateNormal];
        }
        else
        {
            [self.galleryButton setImage:[UIImage imageNamed:@"camera.bundle/camera-library.png"] forState:UIControlStateNormal];
        }
    };

    [self.assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll
                                      usingBlock:assetGroupEnumerator
                                    failureBlock: ^(NSError *error) {
                                        NSLog(@"Failure");
                                    }];
}

использовать это

self.galleryButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.galleryButton setFrame:CGRectMake(260, self.view.frame.size.height - 60, 50, 50)];
[self.galleryButton setImage:[UIImage imageNamed:@"camera.bundle/camera-library.png"] forState:UIControlStateNormal];

// assetsLibrary will take time getting all your images at this point. So performItWithDelay
[self performSelector:@selector(createGalleryButton) withObject:nil afterDelay:0.1];

[self.galleryButton addTarget:self action:@selector(showGallery:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:self.galleryButton];
Другие вопросы по тегам