2014-09-04 3 views
3

Je suis en train de convertir une image YUV en CIIMage et finalement en UIImage. Je suis assez novice dans ces domaines et j'essaie de trouver un moyen facile de le faire. D'après ce que j'ai appris, iOS6 YUV peut être directement utilisé pour créer CIImage mais comme j'essaye de le créer, le CIImage n'a qu'une valeur nulle. Mon code est comme ceci ->Comment convertir YUV en CIImage pour iOS

NSLog(@"Started DrawVideoFrame\n"); 

CVPixelBufferRef pixelBuffer = NULL; 

CVReturn ret = CVPixelBufferCreateWithBytes(
              kCFAllocatorDefault, iWidth, iHeight, kCVPixelFormatType_420YpCbCr8BiPlanarFullRange, 
              lpData, bytesPerRow, 0, 0, 0, &pixelBuffer 
              ); 

if(ret != kCVReturnSuccess) 
{ 
    NSLog(@"CVPixelBufferRelease Failed"); 
    CVPixelBufferRelease(pixelBuffer); 
} 

NSDictionary *opt = @{ (id)kCVPixelBufferPixelFormatTypeKey : 
         @(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange) }; 

CIImage *cimage = [CIImage imageWithCVPixelBuffer:pixelBuffer options:opt]; 
NSLog(@"CURRENT CIImage -> %p\n", cimage); 

UIImage *image = [UIImage imageWithCIImage:cimage scale:1.0 orientation:UIImageOrientationUp]; 
NSLog(@"CURRENT UIImage -> %p\n", image); 

Ici, lpData est la donnée YUV qui est un tableau de caractères non signés.

Cela semble également intéressant: vImageMatrixMultiply, ne trouve aucun exemple à ce sujet. Est-ce que quelqu'un peut m'aider avec ça?

+1

[This] (https://developer.apple.com/library/ios/documentation/graphicsimaging/Conceptual/CoreImaging/ci_performance/ci_performance.html) peut vous aider. – swiftBoy

+1

Merci, j'ai déjà vérifié ce lien. Je suis ceci et employant des options comme ceci mais CIImage n'est pas initialisé – d1xlord

+0

J'ai trouvé ceci [lien] (http://stackoverflow.com/questions/13201084/how-to-convert-a-kcvpixelformattype-420ypcbcr8biplanarfullrange-buffer- to-uiimag? rq = 1). Cela peut être utile. Je vais essayer et afficher le résultat. – d1xlord

Répondre

3

J'ai également fait face à ce problème similaire. J'essayais d'afficher les données formatées YUV (NV12) à l'écran. Cette solution fonctionne dans mon projet ...

//YUV(NV12)-->CIImage--->UIImage Conversion 
NSDictionary *pixelAttributes = @{kCVPixelBufferIOSurfacePropertiesKey : @{}}; 
CVPixelBufferRef pixelBuffer = NULL; 

CVReturn result = CVPixelBufferCreate(kCFAllocatorDefault, 
             640, 
             480, 
             kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange, 
             (__bridge CFDictionaryRef)(pixelAttributes), 
             &pixelBuffer); 

CVPixelBufferLockBaseAddress(pixelBuffer,0); 
unsigned char *yDestPlane = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0); 

// Here y_ch0 is Y-Plane of YUV(NV12) data. 
memcpy(yDestPlane, y_ch0, 640 * 480); 
unsigned char *uvDestPlane = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 1); 

// Here y_ch1 is UV-Plane of YUV(NV12) data. 
memcpy(uvDestPlane, y_ch1, 640*480/2); 
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0); 

if (result != kCVReturnSuccess) { 
    NSLog(@"Unable to create cvpixelbuffer %d", result); 
} 

// CIImage Conversion  
CIImage *coreImage = [CIImage imageWithCVPixelBuffer:pixelBuffer]; 

CIContext *MytemporaryContext = [CIContext contextWithOptions:nil]; 
CGImageRef MyvideoImage = [MytemporaryContext createCGImage:coreImage 
                fromRect:CGRectMake(0, 0, 640, 480)]; 

// UIImage Conversion 
UIImage *Mynnnimage = [[UIImage alloc] initWithCGImage:MyvideoImage 
               scale:1.0 
              orientation:UIImageOrientationRight]; 

CVPixelBufferRelease(pixelBuffer); 
CGImageRelease(MyvideoImage); 

Ici je montre la structure de données des données YUV (NV12) et comment nous pouvons obtenir le Y-Plane (y_ch0) et UV-Plane (y_ch1) qui est utilisé pour créer CVPixelBufferRef. Regardons le YUV (NV12) structure de données .. enter image description here Si nous regardons l'image que nous pouvons obtenir les informations suivantes au sujet YUV (NV12),

  • Cadre Taille totale = Largeur * Hauteur * 3/2,
  • Y-Plane taille = taille de l'image * 2/3,
  • taille UV-Plane = taille de l'image * 1/3,
  • données stockées dans Y-Plane -> {Y1, Y2, Y3, Y4, Y5 .....}.
  • U-Plane -.> (U1, V1, U2, V2, U3, V3, ......}

J'espère que ce sera utile à tous :) Amusez-vous avec. Développement IOS: D

+0

Ce code source n'est valide que si vous avez seulement des données YUV (NV12). Si vous avez des données formatées YUV (I420), vous aurez besoin d'une simple conversion YUV (I420) en YUV (NV12). – RajibTheKing

+2

Veuillez fournir le code pour l'initialisation y_ch0 et y_ch1 – JULIIncognito