Core Image フィルタを使用してスライドの背景をキーアウトし、特定の色のテキストをキーアウトする簡単な方法を考え出そうとしています。現在のプロジェクトは機能しますが、注意点が 1 つあります。削除しようとしているテキストは消えていますが、後光が残っています。
問題を示すスクリーンショットを次に示します。
私が知る限り、「メイン スライド コンテンツ」の周りに青いハローがありますが、メイン コンテンツがまだ画面に表示されているので、これはおそらく問題ありません。ただし、「Test Speaker Notes」の周りのハローを削除したいと思います。これは、完全にキーアウトすることを目的としているためです。
私の頭の中では、解決策は緑色のテキストのマスクを取得し、そのマスクを少し拡張し、それを乗算フィルターで使用してハローをキーアウトすることだと思いますが、方法がわかりませんCore Image でこれにアプローチします。ここで進むべき道についてのガイダンスをいただければ幸いです。ここに私の applicationDidFinishLaunching メソッドとキーイング メソッドとブレンド メソッドがあります。これらは作業を行う 2 つのメソッドです。すべてのコードは GitHub のプロジェクト ファイルにあります。[こちら]: https://github.com/nspaul/chromakeytest
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSImage *img = [NSImage imageNamed:@"testSlide.png"];
NSImage *actsBG = [NSImage imageNamed:@"background.png"];
NSImage *keyed = img;
//Key out the green
keyed = [self keyImage:keyed minHue:0.25 maxHue:0.4];
//Key out the blue background
keyed = [self keyImage:keyed minHue:0.6 maxHue:0.7];
//Put the test slide over the background slide
keyed = [self blendImage:keyed withBackgroundImage:actsBG];
[_topImageView setImage:img];
[_backgroundImageView setImage:actsBG];
[_keyedImageView setImage:keyed];
}
-(NSImage *)blendImage:(NSImage *)img withBackgroundImage:(NSImage *)bgimg {
CIImage *inputImage = [[CIImage alloc] initWithData:[img TIFFRepresentation]];
CIImage *bgInputImage = [[CIImage alloc] initWithData:[bgimg TIFFRepresentation]];
CIFilter *blendFilter = [CIFilter filterWithName:@"CISourceOverCompositing"];
[blendFilter setValue:inputImage forKey:@"inputImage"];
[blendFilter setValue:bgInputImage forKey:@"inputBackgroundImage"];
CIImage *outputImage = [blendFilter valueForKey:@"outputImage"];
NSImage *resultImage = [[NSImage alloc] initWithSize:[outputImage extent].size];
NSCIImageRep *rep = [NSCIImageRep imageRepWithCIImage:outputImage];
[resultImage addRepresentation:rep];
return resultImage;
}
-(NSImage *) keyImage:(NSImage *)imageToKey minHue:(float)minHueAngle maxHue:(float)maxHueAngle {
CIImage *ciImage = [[CIImage alloc] initWithData:[imageToKey TIFFRepresentation]];
// Allocate memory
const unsigned int size = 64;
float *cubeData = (float *)malloc (size * size * size * sizeof (float) * 4);
float rgb[3], hsv[3], *c = cubeData;
// Populate cube with a simple gradient going from 0 to 1
for (int z = 0; z < size; z++){
rgb[2] = ((double)z)/(size-1); // Blue value
for (int y = 0; y < size; y++){
rgb[1] = ((double)y)/(size-1); // Green value
for (int x = 0; x < size; x ++){
rgb[0] = ((double)x)/(size-1); // Red value
// Convert RGB to HSV
// You can find publicly available rgbToHSV functions on the Internet
rgbToHSV(rgb, hsv);
// Use the hue value to determine which to make transparent
// The minimum and maximum hue angle depends on
// the color you want to remove
float alpha = (hsv[0] > minHueAngle && hsv[0] < maxHueAngle) ? 0.0f: 1.0f;
// Calculate premultiplied alpha values for the cube
c[0] = rgb[0] * alpha;
c[1] = rgb[1] * alpha;
c[2] = rgb[2] * alpha;
c[3] = alpha;
c += 4; // advance our pointer into memory for the next color value
}
}
}
NSLog(@"cubeData: %p",cubeData);
// Create memory with the cube data
NSData *data = [NSData dataWithBytesNoCopy:cubeData
length:(64 * 64 * 64 * sizeof (float) * 4)
freeWhenDone:YES];
CIFilter *colorCube = [CIFilter filterWithName:@"CIColorCube"];
[colorCube setValue:[NSNumber numberWithInt:size] forKey:@"inputCubeDimension"];
// Set data for cube
[colorCube setValue:data forKey:@"inputCubeData"];
[colorCube setValue:ciImage forKey:kCIInputImageKey];
CIImage *outImage = [colorCube valueForKey:@"outputImage"];
NSImage *resultImage = [[NSImage alloc] initWithSize:[outImage extent].size];
NSCIImageRep *rep = [NSCIImageRep imageRepWithCIImage:outImage];
[resultImage addRepresentation:rep];
return resultImage;
}