1

コールバックからを作成し、 から を作成してからに表示するAVFoundationことで、ビデオを再生するために使用しています。CGImageAVFoundationUIImageCGImageUIImageUIImageView

画面に表示する前に、画像に色補正を適用したいと考えています。取得した画像に色を付ける最良の方法は何ですか?

を使用してみCIFiltersましたが、最初に from を作成し、次にそれを色付けし、次に を作成してから を作成する必要がCIImageあります。AVFoundationCGImageUIImageCIImage

さらに、 のパフォーマンスが十分に高速であるようには見えません。CIFilters少なくとも、追加のCIImage. これを行うためのより速い方法についての提案はありますか?

前もって感謝します。

4

1 に答える 1

1

EAGLContext標準の代わりにを使用することCIContextが答えのようです。これにより、私のニーズに合わせてカラー化された画像を作成するのに十分なパフォーマンスが得られます。

簡単なコード例:

初期化時:

NSMutableDictionary *options = [[NSMutableDictionary alloc] init];
[options setObject: [NSNull null] forKey: kCIContextWorkingColorSpace];
m_EAGLContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
m_CIContext = [CIContext contextWithEAGLContext:m_EAGLContext options:options];

色を設定します:

-(void)setColorCorrection:(UIColor*)color
{  
  CGFloat r,g,b,a;
  [color getRed:&r green:&g blue:&b alpha:&a];

  CIVector *redVector = [CIVector vectorWithX:r Y:0 Z:0];
  CIVector *greenVector = [CIVector vectorWithX:0 Y:g Z:0];
  CIVector *blueVector = [CIVector vectorWithX:0 Y:0 Z:b];

  m_ColorFilter = [CIFilter filterWithName:@"CIColorMatrix"];
  [m_ColorFilter setDefaults];
  [m_ColorFilter setValue:redVector forKey:@"inputRVector"];
  [m_ColorFilter setValue:greenVector forKey:@"inputGVector"];
  [m_ColorFilter setValue:blueVector forKey:@"inputBVector"];
}

各ビデオ フレームで:

CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
CGImageRef cgImage = nil;

CIImage *ciImage = [CIImage imageWithCVPixelBuffer:pixelBuffer];

[m_ColorFilter setValue:ciImage forKey:kCIInputImageKey];
CIImage *adjustedImage = [m_ColorFilter valueForKey:kCIOutputImageKey];

cgImage = [m_CIContext createCGImage:adjustedImage fromRect:ciImage.extent];
于 2013-06-06T09:06:29.263 に答える