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;
}
}
這是在黑暗中拍攝的照片,但如果使用「kCGImageAlphaFirst」而不是「kCGImageAlphaPremultipliedFirst」,會發生什麼情況? –
是的,我試過所有的組合。有些不起作用,其他人需要修復CVReturn語句。如果我使用ARGB並將狀態更改爲kCVPixelFormatType_32BRGA,則圖像的顏色會更改,但仍然不會透明 – Michiel