Проблемы с созданием 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];
Ответы
Ответ 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
.