Convertir UIImage à CVImageBufferRef

Ce code fonctionne majoritairement, mais les données qui en résulte semble perdre un canal de couleur (est ce que je pense) que les données d'image lors de l'affichage est teintée en bleu!

Voici le code:

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

La méthode pixelBufferFromCGIImage a été saisi à partir d'un autre poste sur stackoverflow ici: Comment puis-je exporter UIImage tableau comme un film? (bien que cette application est sans rapport avec ce que je suis en train de faire), il est

+ (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;
}

Je pense qu'il a quelque chose à voir avec la relation entre kCVPixelFormatType_32ARGB et kCGImageAlphaNoneSkipLast si j'ai essayé toutes les combinaisons et d'obtenir le même résultat ou d'un plantage de l'application. Encore une fois, cela devient à la UIImage données dans CVImageBufferRef mais quand j'affiche l'image sur l'écran, il semble qu'il lâche un canal de couleur et se montre teintée en bleu. L'image est au format png.

OriginalL'auteur Eric | 2011-11-15