Подтвердить что ты не робот

Проблемы с созданием UIImage из CIImage в iOS5

Я использую структуру AVFoundation. В моем представителе буфера выборки у меня есть следующий код:

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection{
     CVPixelBufferRef pb = CMSampleBufferGetImageBuffer(sampleBuffer);
     CIImage *ciImage = [CIImage imageWithCVPixelBuffer:pb];
     self.imageView.image = [UIImage imageWithCIImage:ciImage];
}

Я могу использовать CIImage для запуска детектора лица и т.д., но он не отображается в UIImageView... imageView остается белым. Любые идеи относительно проблемы? Для настройки сеанса я использую следующее:

    self.session = [[AVCaptureSession alloc] init];
self.session.sessionPreset = AVCaptureSessionPreset640x480;
self.videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
self.videoInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:nil]; 
self.frameOutput = [[AVCaptureVideoDataOutput alloc] init];
self.frameOutput.videoSettings = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey];
4b9b3361

Ответ 1

Это может помочь. У меня была такая же проблема (изображение не рисуется на экране) с помощью этого кода:

CIImage *image = [[CIImage alloc] initWithImage:[UIImage imageNamed:@"mushroom.jpg"]];

theImageView.image = [UIImage imageWithCIImage:image];

Однако после изменения кода на него он работает корректно:

CIImage *image = [[CIImage alloc] initWithImage:[UIImage imageNamed:@"mushroom.jpg"]];

CIContext *context = [CIContext contextWithOptions:nil];

theImageView.image = [UIImage imageWithCGImage:[context createCGImage:image fromRect:image.extent]];

Подробнее о CIContext читайте здесь: http://developer.apple.com/library/ios/#DOCUMENTATION/GraphicsImaging/Reference/QuartzCoreFramework/Classes/CIContext_Class/Reference/Reference.html#//apple_ref/occ/cl/CIContext

Ответ 2

Вот один из способов заставить меня работать:

CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef ref = [context createCGImage:result fromRect:ciImage.extent];
self.imgView.image = [UIImage imageWithCGImage:ref scale:1.0 orientation:UIImageOrientationRight];
CGImageRelease(ref);

Примечание. Создание контекста несколько раз очень плохо и фактически вызывает утечку памяти. Вы должны просто создать контекст один раз как свойство в экземпляре вашего класса и повторно использовать его!

Ответ 3

CIImage *ciImage = [UIImage imageNamed:@"imageName.png"].CIImage;
UIImage *uiImage = [[UIImage alloc] initWithCIImage:ciImage];

Ответ 4

Вот полный образец кода, который я использовал в своих проектах.

- (UIImage *)makeUIImageFromCIImage:(CIImage *)ciImage {
    CIContext *context = [CIContext contextWithOptions:nil];
    CGImageRef cgImage = [context createCGImage:ciImage fromRect:[ciImage extent]];

    UIImage* uiImage = [UIImage imageWithCGImage:cgImage];
    CGImageRelease(cgImage);

    return uiImage;
}

CIImage - это в основном рецепт изображения. У вас возникнут проблемы, если вы попытаетесь напрямую конвертировать из CIImage в UIImage. Например, вызов

NSData * UIImageJPEGRepresentation (
   UIImage *image,
   CGFloat compressionQuality
);

вернется nil.