2011-10-17 3 views
16

sto utilizzando il framework AVFoundation. Nel mio tampone campione delegato Ho il seguente codice:Avendo problemi a creare UIImage da CIImage in iOS5

-(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]; 
} 

sono in grado di utilizzare il CIImage per eseguire il rilevatore faccia ecc, ma non mostra nella UIImageView ... l'ImageView rimane bianca. Qualche idea sul problema? Sto usando il seguente per impostare la mia sessione:

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

risposta

32

Questo potrebbe aiutare. Ho avuto lo stesso problema (immagine non in corso di definizione a schermo) con questo codice:

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

theImageView.image = [UIImage imageWithCIImage:image]; 

Tuttavia, dopo aver cambiato il codice per questo, ora funziona correttamente:

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

CIContext *context = [CIContext contextWithOptions:nil]; 

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

Per saperne di più CIContext dare un'occhiata qui: http://developer.apple.com/library/ios/#DOCUMENTATION/GraphicsImaging/Reference/QuartzCoreFramework/Classes/CIContext_Class/Reference/Reference.html#//apple_ref/occ/cl/CIContext

+0

Grazie - questo in effetti mi permetta di disegnare l'immagine. Tuttavia perde la memoria causando l'arresto anomalo dell'app dopo pochi secondi. – user491880

+0

Sì, non ci ho ancora pensato molto. Sono sicuro che devi rilasciare i contesti o il CGImageRef ad un certo punto. Inoltre sono sicuro che il metodo sopra non è il modo pratico di usare le viste CIImage. ho intenzione di guardare il "Utilizzare Core Image su iOS e Mac OS X" video (che si trova sul sito Apple Developer, WWDC 2011 Session Video) domani e imparare di più in profondità, io cadere una linea se imparo qualsiasi cosa utile – spybart

+0

vi consiglio anche guardare questo video e/o guardare le slide della presentazione in quanto spiega come utilizzare Core Image, e va in dettaglio sui contesti e quando utilizzare CPU/GPU e più – spybart

7

qui è un modo che ho preso a lavorare:

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); 

Nota: creare il contesto più volte è davvero male e in realtà causa una perdita di memoria. Dovresti semplicemente creare il contesto una volta come proprietà nell'istanza della classe e riutilizzarlo!

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

Non ha funzionato per me. Ho creato il CIImage in un modo diverso da quello mostrato qui. – Automatico

3

Ecco un esempio di codice completo che ho utilizzato nei miei progetti.

- (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 è fondamentalmente una ricetta per un'immagine. Incontrerai problemi se proverai a convertire direttamente da CIImage a UIImage. Ad esempio, chiamando

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

restituirà nil.

+0

geniale, grazie !!! Mi chiedo perché Apple fornisce [UIImage imageWithCIImage] se funziona raramente. Grazie Apple. – SpaceDog

+0

Mi sono imbattuto in alcuni problemi di distorsione del colore e di fusione alfa molto delicati con questo metodo, risolti impostando il contesto dello spazio colore = [CIContext contextWithOptions: @ {kCIContextWorkingColorSpace: [NSNull null]}]; – user1055568