Преобразование UIImage в CVImageBufferRef

Этот код в основном работает, но в результирующих данных, кажется, теряется цветовой канал (это то, о чем я думаю), поскольку результирующие данные изображения при отображении имеют синий оттенок!

Вот код:

UIImage* myImage=[UIImage imageNamed:@"sample1.png"];
CGImageRef imageRef=[myImage CGImage];
CVImageBufferRef pixelBuffer = [self pixelBufferFromCGImage:imageRef];

Метод 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;
}

Я думаю, это как-то связано с отношениями между kCVPixelFormatType_32ARGB и kCGImageAlphaNoneSkipLast, хотя я пробовал каждую комбинацию и получил либо тот же результат, либо сбой приложения. Еще раз, это передает данные UIImage в CVImageBufferRef, но когда я показываю изображение на экране, кажется, что он теряет цветовой канал и отображается с синим оттенком. Изображение в формате png.

15
задан Community 23 May 2017 в 11:53
поделиться