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

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

Ответы [ 2 ]

7 голосов
/ 10 августа 2011

Вы можете использовать каркас 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];
0 голосов
/ 25 июня 2013

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

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

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];
...