このコードはほとんど動作しますが、結果のデータは、表示された青色が青色になると、結果として得られる画像データがカラーチャンネルを失うようです。UIImageをCVImageBufferRefに変換します
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の関係と関係があると考えていますが、すべての組み合わせを試しても同じ結果かアプリケーションクラッシュが発生します。再び、これはUVImageデータをCVImageBufferRefに取得しますが、画像を画面に表示すると、カラーチャンネルが緩んで青色になります。画像はpngです。
答えをありがとう。解決策は、このコードが意図どおり完全に動作することです。問題は、OpenGLテクスチャを作成する際にデータを使用することでした。このコードに完全に無関係です。 UIImageをCVImageBufferRefに変換する方法を探している人は、あなたの答えは上記のコードにあります! – Eric
参考:PNGは必ずしも索引付けされているわけではありません(GIFのように)、ロスレスなフルカラーRGBイメージもサポートしています(線画やソリッドカラーブロックではうまく機能します)。 – Ethan