Возникли проблемы при создании UIImage из CIImage в iOS5 - PullRequest
17 голосов
/ 17 октября 2011

Я использую фреймворк 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];

Ответы [ 4 ]

35 голосов
/ 17 октября 2011

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

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

7 голосов
/ 17 октября 2011

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

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 голосов
/ 18 марта 2015

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

- (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.

3 голосов
/ 10 мая 2012
CIImage *ciImage = [UIImage imageNamed:@"imageName.png"].CIImage;
UIImage *uiImage = [[UIImage alloc] initWithCIImage:ciImage];
...