【发布时间】:2014-01-19 17:00:35
【问题描述】:
我正在使用此代码通过 AVAssetWriter 从不同的 uiimage 创建电影。代码效果很好,但问题是当我将图像添加到作者时,Alpha 通道消失了。我无法确定 CVPixelBufferRef 中是否不存在 alpha 或者 AVAssetWriter 无法处理。
我的最终结果不是具有 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 图像的颜色会更改但仍然没有透明度
标签: ios transparency avfoundation avassetwriter