【发布时间】:2011-12-29 14:18:20
【问题描述】:
这段代码大部分都可以工作,但结果数据似乎失去了一个颜色通道(我在想什么),因为结果图像数据在显示时被染成蓝色!
代码如下:
UIImage* myImage=[UIImage imageNamed:@"sample1.png"];
CGImageRef imageRef=[myImage CGImage];
CVImageBufferRef pixelBuffer = [self pixelBufferFromCGImage:imageRef];
该方法 pixelBufferFromCGIImage 是从 stackoverflow 上的另一篇文章中获取的:How do I export UIImage array as a movie?(尽管此应用程序与我正在尝试做的事情无关)它是
+ (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。
【问题讨论】: