将UIImage转换为CVPixelBufferRef时,Alpha通道消失了

时间:2014-01-19 17:00:35

标签: ios transparency avfoundation avassetwriter

我正在使用此代码使用AVAssetWriter从不同的uiimages创建电影。代码工作得很好,但问题是当我将图像添加到编写器时,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;
    }
}

1 个答案:

答案 0 :(得分:0)

这永远不会起作用,因为h.264不支持alpha通道。您无法使用内置的iOS逻辑(故事结束)使用Alpha通道对电影进行编码。但是,可以在编码之前合成图层。也可以使用支持alpha通道的第三方库编写编码。有关详细信息,请参阅this question