【问题标题】:Alpha channel gone when converting UIImage to CVPixelBufferRef将 UIImage 转换为 CVPixelBufferRef 时 Alpha 通道消失
【发布时间】: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


【解决方案1】:

这永远行不通,因为 h.264 不支持 Alpha 通道。您不能使用内置的 iOS 逻辑对带有 alpha 通道的电影进行编码,故事结束。不过,可以在编码之前合成图层。也可以使用支持 alpha 通道的 3rd 方库来编写编码。请参阅this question 了解更多信息。

【讨论】:

    猜你喜欢
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 2016-06-11
    • 2019-01-25
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多