2014-01-19 55 views
0

我正在使用此代碼通過AVAssetWriter從不同的uiimages創建電影。這些代碼工作的很好,但問題是,當我將圖像添加到作者時,Alpha通道消失了。我無法弄清如果Alpha不存在於CVPixelBufferRef中或者AVAssetWriter無法處理。將UIImage轉換爲CVPixelBufferRef時Alpha通道消失

我的最終結果不是具有Alpha通道的電影,而是多個圖像疊加在一起併合併到電影文件中。我可以把其它圖像的頂部的圖像在一個單一的框架,但所有的圖像(像素緩衝區)有一個黑色的背景...

- (CVPixelBufferRef) pixelBufferFromCGImage: (CGImageRef) image andSize:(CGSize) size { 
    @autoreleasepool { 
     NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
           [NSNumber numberWithBool:YES],  kCVPixelBufferCGImageCompatibilityKey, 
           [NSNumber numberWithBool:YES],  kCVPixelBufferCGBitmapContextCompatibilityKey, 
           nil]; 
     CVPixelBufferRef pxbuffer = NULL; 

     CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, size.width, 
               size.height, kCVPixelFormatType_32ARGB,  (__bridge CFDictionaryRef) options, 
               &pxbuffer); 
     NSParameterAssert(status == kCVReturnSuccess && pxbuffer != NULL); 

     CVPixelBufferLockBaseAddress(pxbuffer, 0); 
     void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer); 
     NSParameterAssert(pxdata != NULL); 

     CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB(); 
     CGContextRef context = CGBitmapContextCreate(pxdata, size.width, size.height, 8,  4*size.width, rgbColorSpace, (CGBitmapInfo)kCGImageAlphaPremultipliedFirst); 

     NSParameterAssert(context); 
     CGContextConcatCTM(context, CGAffineTransformMakeRotation(0)); 
     CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image), 
               CGImageGetHeight(image)), image); 
     CGColorSpaceRelease(rgbColorSpace); 
     CGContextRelease(context); 

     CVPixelBufferUnlockBaseAddress(pxbuffer, 0); 

     return pxbuffer; 
    } 
} 
+0

這是在黑暗中拍攝的照片,但如果使用「kCGImageAlphaFirst」而不是「kCGImageAlphaPremultipliedFirst」,會發生什麼情況? –

+0

是的,我試過所有的組合。有些不起作用,其他人需要修復CVReturn語句。如果我使用ARGB並將狀態更改爲kCVPixelFormatType_32BRGA,則圖像的顏色會更改,但仍然不會透明 – Michiel

回答

0

這是從來沒有去上班,因爲H.264並不支持阿爾法渠道。您無法使用內置的iOS邏輯對故事結局進行Alpha通道編碼。雖然可以在編碼之前複合圖層。也可以使用支持Alpha通道的第三方庫編寫編碼。有關更多信息,請參閱this question