将UIImage转换为CVImageBufferRef

Eri*_*ric 15 iphone bitmap uiimage ios

这段代码大部分都有效,但结果数据似乎松散了一个颜色通道(正如我所想),因为显示的结果图像数据是蓝色的!

这是代码:

UIImage* myImage=[UIImage imageNamed:@"sample1.png"];
CGImageRef imageRef=[myImage CGImage];
CVImageBufferRef pixelBuffer = [self pixelBufferFromCGImage:imageRef];
Run Code Online (Sandbox Code Playgroud)

方法pixelBufferFromCGIImage是从stackoverflow上的另一个帖子中获取的:如何将UIImage数组导出为电影?(虽然这个应用程序与我想要做的事情无关)但确实如此

+ (CVPixelBufferRef)pixelBufferFromCGImage:(CGImageRef)image
{
    CGSize frameSize = CGSizeMake(CGImageGetWidth(image), CGImageGetHeight(image));
    NSDictionary *options = @{
                              (__bridge NSString *)kCVPixelBufferCGImageCompatibilityKey: @(NO),
                              (__bridge NSString *)kCVPixelBufferCGBitmapContextCompatibilityKey: @(NO)
                              };
    CVPixelBufferRef pixelBuffer;
    CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, frameSize.width,
                                          frameSize.height,  kCVPixelFormatType_32ARGB, (__bridge CFDictionaryRef) options,
                                          &pixelBuffer);
    if (status != kCVReturnSuccess) {
        return NULL;
    }

    CVPixelBufferLockBaseAddress(pixelBuffer, 0);
    void *data = CVPixelBufferGetBaseAddress(pixelBuffer);
    CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(data, frameSize.width, frameSize.height,
                                                 8, CVPixelBufferGetBytesPerRow(pixelBuffer), rgbColorSpace,
                                                 (CGBitmapInfo) kCGImageAlphaNoneSkipLast);
    CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image),
                                           CGImageGetHeight(image)), image);
    CGColorSpaceRelease(rgbColorSpace);
    CGContextRelease(context);
    CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);

    return pixelBuffer;
}
Run Code Online (Sandbox Code Playgroud)

我认为它与kCVPixelFormatType_32ARGB和kCGImageAlphaNoneSkipLast之间的关系有关,虽然我已经尝试了每个组合并获得相同的结果或应用程序崩溃.再次,这将UIImage数据转换为CVImageBufferRef但是当我在屏幕上显示图像时,它似乎松散了一个颜色通道并显示有色蓝色.图像是png.

Eri*_*ric 5

解决方案是此代码完全按预期工作.:)问题在于使用数据创建OpenGL纹理.与此代码完全无关.任何搜索如何将UIImage转换为CVImageBufferRef的人,您的答案都在上面的代码中!


小智 -1

听起来可能就是这种关系。可能是 jpg 和 RGB,而不是带有 png 的索引颜色?

  • 感谢你的回答。解决方案是该代码可以按照预期完美运行。问题在于使用数据创建 OpenGL 纹理。与此代码完全无关。任何搜索如何将 UIImage 转换为 CVImageBufferRef 的人,您的答案就在上面的代码中! (2认同)