В настоящее время я перевожу устаревший проект с iOS 5/6 на iOS 6/7.
Часть этого проекта включает в себя создание изображения с использованием библиотеки GPUImage, его обработку с помощью обрезающего фильтра, а затем, при необходимости, добавление некоторых эффектов насыщенности и размытия. В настоящее время я использую версию 0.1.2, установленную через какао-бобы.
Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь захватить изображение с камеры, я нажимаю следующее утверждение в GPUImageStillCamera.m line 254
if (CVPixelBufferGetPlaneCount(cameraFrame) > 0)
{
NSAssert(NO, @"Error: no downsampling for YUV input in the framework yet");
}
где cameraFrame
это CVImageBufferRef
Я воспроизвел код, в котором это вызывается, и перенес его в другой проект, где он отлично работает.
Как только я переместил этот воспроизведенный класс обратно в основной проект, я каждый раз нажимал на утверждение.
Вещи, которые я исключил с помощью собственной отладки
- 64bit (это происходит на обоих)
- другая версия библиотеки
- первоначальная настройка объекта/код/использование
Это привело меня к мысли, что, возможно, это может быть настройка проекта, которую я просмотрел. Любая помощь или даже указатель в правильном направлении будут очень приветствоваться. Я потратил на это добрых 1-2 дня и все еще полностью потерян!
Я включил урезанный класс ниже, который показывает общее использование.
#import "ViewController.h"
#import "GPUImage.h"
#import "ImageViewController.h"
@interface ViewController ()
@property (nonatomic, strong) IBOutlet GPUImageView *gpuImageView;
@property (nonatomic, strong) GPUImageStillCamera *camera;
@property (nonatomic, strong) GPUImageCropFilter *cropFilter;
@end
@implementation ViewController
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self setupCameraCapture];
}
- (void)setupCameraCapture
{
if (self.camera) {
return;
}
self.cropFilter = [[GPUImageCropFilter alloc] initWithCropRegion:CGRectMake(0, 0, 1, 0.5625)];
if ([UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear]) {
self.camera = [[GPUImageStillCamera alloc] initWithSessionPreset:AVCaptureSessionPresetPhoto cameraPosition:AVCaptureDevicePositionBack];
}
else {
self.camera = [[GPUImageStillCamera alloc] initWithSessionPreset:AVCaptureSessionPresetPhoto cameraPosition:AVCaptureDevicePositionFront];
}
self.camera.outputImageOrientation = UIInterfaceOrientationPortrait;
NSError *error = nil;
[self.camera.inputCamera lockForConfiguration:&error];
[self.camera.inputCamera setExposureMode:AVCaptureExposureModeContinuousAutoExposure];
[self.camera.inputCamera setWhiteBalanceMode:AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance];
if ([self.camera.inputCamera respondsToSelector:@selector(isLowLightBoostSupported)]) {
BOOL isSupported = self.camera.inputCamera.isLowLightBoostSupported;
if (isSupported) {
[self.camera.inputCamera setAutomaticallyEnablesLowLightBoostWhenAvailable:YES];
}
}
[self.camera.inputCamera unlockForConfiguration];
[self.camera addTarget:self.cropFilter];
[self.cropFilter addTarget:self.gpuImageView];
[self.camera startCameraCapture];
}
- (IBAction)capturePressed:(id)sender
{
[self.camera capturePhotoAsImageProcessedUpToFilter:self.cropFilter withCompletionHandler:^(UIImage *image, NSError *error) {
// do something with the image here
}];
}
@end