Обратите внимание: это для приложения командной строки Cocoa, работающего в Mac OSX, а НЕ для приложения iOS
У меня проблемы с пониманием Ограниченная документация, предоставленная Apple для фильтра CISpotColor (с использованием CIFilter).
TL DR;
1) Есть ли еще документация о CIFilter, в частности о CISpotColor, которую мне где-то не хватает?
2) Учитывая то, чего я пытаюсь достичь (описывается ниже в виде иллюстраций, но кратко: замените все, что не «выглядит красным» на белое, и заставьте все, что «выглядит красным (иш)», либо сплошным красным, либо просто черным) , подходит ли CISpotColor фильтр, который мне следует использовать?
3) Если нет, то какие фильтры вы предлагаете (или я должен попробовать создать собственный?)
4) Если CISSpotColor - правильный фильтр, какие параметры мне следует использовать для достижения того, чего я пытаюсь достичь. Если мне нужно использовать несколько проходов CISpotColor CIFilter, ничего страшного, я не ожидаю, что вы напишете его для меня, просто укажите правильное направление.
Более подробная информация и справочная информация по вышеуказанным вопросам:
ссылка выше дает список параметров, некоторые значения по умолчанию, а также пример изображения до и после изображения, но без образца кода, который генерировал образец после изображения, и без объяснения того, что на самом деле означают параметры или каковы их допустимые диапазоны.
Честно говоря, я не совсем уверен, является ли CISpotColor тем фильтром, который мне нужен, поскольку кроме его имени и предложения «Заменяет один или несколько цветовых диапазонов на плашечные цвета» нет никаких объяснений. о том, как он делает то, что делает.
Поскольку это фильтр, который, кажется, описывает то, что мне нужно, я выбрал его в качестве отправной точки, чтобы понять, как работать с фильтрами таким образом.
Введите изображение (кадр из видео)
Желаемый результат (вариант 1 - сплошной красный - создано с помощью GIMP)
Желаемый результат (вариант 2 - сплошной черный - также создается с помощью GIMP)
Что я получаю с помощью своего кода (список см. ниже)
Это близко к тому, что мне нужно, но, похоже, не учитывается тот факт, что области, которые являются серыми или «белыми» на исходном изображении, будут иметь одинаковое количество красного, зеленого и синего, а не преимущественно красного, что сделало бы его "красным". Я мог бы работать с ним, если бы он отфильтровал область, которую вы видите в правом нижнем углу, которая явно просто включена, потому что там есть некоторые красные пиксели (а также некоторые зеленые и синие, что делает его обычно серым в оригинале) .
Вот полный файл main.m для приложения командной строки какао (Mac OSX)
#import <Foundation/Foundation.h>
#import <CoreGraphics/CoreGraphics.h>
#import <AppKit/AppKit.h>
#import <QuartzCore/QuartzCore.h>
@interface NSImage(saveAsJpegWithName)
- (void) saveAsPNGWithName:(NSString*) fileName;
- (NSImage*) filterEverythingButRed ;
@end
@implementation NSImage(saveAsJpegWithName)
- (void) saveAsPNGWithName:(NSString*) fileName
{
NSData *imageData = [self TIFFRepresentation];
NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:imageData];
NSDictionary *imageProps = nil;
imageData = [imageRep representationUsingType:NSPNGFileType properties:imageProps];
[imageData writeToFile:fileName atomically:NO];
}
-(NSImage*) filterEverythingButRed {
CIImage *inputImage = [[CIImage alloc] initWithData:[self TIFFRepresentation]];
CIFilter *hf = [CIFilter filterWithName:@"CISpotColor"];
[hf setDefaults];
[hf setValue:inputImage forKey:@"inputImage"];
[hf setValue:[CIColor colorWithRed:1.0 green:0.0 blue:0.0] forKey: @"inputCenterColor1"];
[hf setValue:[CIColor colorWithRed:1.0 green:0.0 blue:0.0] forKey: @"inputReplacementColor1"];
[hf setValue:[NSNumber numberWithFloat:0.1] forKey: @"inputCloseness1"];
[hf setValue:[NSNumber numberWithFloat:1.0] forKey: @"inputContrast1"];
CIImage *outputImage = [hf valueForKey: @"outputImage"];
NSImage *resultImage = [[NSImage alloc] initWithSize:[outputImage extent].size];
NSCIImageRep *rep = [NSCIImageRep imageRepWithCIImage:outputImage];
[resultImage addRepresentation:rep];
return resultImage;
}
@end
int main(int argc, const char * argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
if (argc == 1) {
NSString * appname = [NSString stringWithFormat: @"%s", argv[0]];
NSLog(@"Usage: %@ filename", appname);
} else {
NSString * filename = [NSString stringWithFormat: @"%s", argv[1]];
NSFileManager *fm = [NSFileManager defaultManager];
if ([fm fileExistsAtPath:filename]) {
NSLog(@"opening file:%@", filename);
NSImage *img = [[NSImage alloc] initWithContentsOfFile:filename];
[[img filterEverythingButRed]
saveAsPNGWithName:[[filename stringByDeletingPathExtension] stringByAppendingString:@"-red.png"]];
} else {
NSLog(@"file not found:%@", filename);
}
}
[pool release];
return 0;
}