Использование CIImage от CIColor в CIFilter: получение пустого изображения

Я пытаюсь создать фильтр CIF в режиме наложения (например, наложение или умножение). Соответствующий код:

// Let's try a filter here
// Get the data
NSData *imageData = UIImageJPEGRepresentation(image, 0.85);
// Create a CI Image
CIImage *beginImage = [CIImage imageWithData:imageData];
CIImage *overlay = [CIImage imageWithColor:[CIColor colorWithRed:0.7 green:0.75 blue:0.9 alpha:0.75]];
// Create a context
CIContext *context = [CIContext contextWithOptions:nil];
// Create filter
CIFilter *filter = [CIFilter filterWithName:@"CIOverlayBlendMode" 
                                  keysAndValues:@"inputImage", beginImage,
                                                @"inputBackgroundImage", overlay,
                                                nil];

Другие фильтры работают нормально (например, сепия), но с фильтром, который требует & quot; inputBackgroundImage & quot; ключ, я получаю пустой / пустой результат ... так что, кажется, что-то не так с моим фоновым изображением.

Как использовать фильтр режима наложения, поместив сплошной цвет поверх изображения?

 Brad Larson♦06 июн. 2012 г., 00:20
Вы убедились, чтоoverlay изображение генерируется правильно, когда вы используете-imageWithColor:? Это не ноль? Можете ли вы создать UIImage из него, который выглядит правильно?

Ответы на вопрос(2)

//assume beginImage is CIImage you want to tint            
CIImage* outputImage = nil;

//create some blue
CIFilter* blueGenerator = [CIFilter filterWithName:@"CIConstantColorGenerator"];
CIColor* blue = [CIColor colorWithString:@"0.1 0.5 0.8 1.0"];
[blueGenerator setValue:blue forKey:@"inputColor"];
CIImage* blueImage = [blueGenerator valueForKey:@"outputImage"];

//apply a multiply filter
CIFilter* filterm = [CIFilter filterWithName:@"CIMultiplyCompositing"];
[filterm setValue:blueImage forKey:@"inputImage"];
[filterm setValue:beginImage forKey:@"inputBackgroundImage"];
outputImage = [filterm valueForKey:@"outputImage"];
 04 окт. 2012 г., 11:54
Чтобы улучшить качество вашего сообщения, укажите, как и почему этот код решит проблему.

должно быть только одно исправление.

NSData *imageData = UIImageJPEGRepresentation(image, 0.85);
// Create a CI Image
CIImage *beginImage = [CIImage imageWithData:imageData];
CIImage *overlay = [CIImage imageWithColor:[CIColor colorWithRed:0.7 green:0.75 blue:0.9 alpha:0.75]];

//You should crop the generated image to beginImage size because generated image's size is infinite. I don't know why, but CIOverlayBlendMode isn't tolerant to infinite size
    overlay = [overlay imageByCroppingToRect:CGRectMake(beginImage.extent.origin.x, beginImage.extent.origin.y, beginImage.extent.size.width, beginImage.extent.size.height)];

// Create a context
CIContext *context = [CIContext contextWithOptions:nil];
// Create filter
CIFilter *filter = [CIFilter filterWithName:@"CIOverlayBlendMode" 
                                      keysAndValues:@"inputImage", beginImage,
                                                    @"inputBackgroundImage", overlay,
                                                    nil];

Ваш ответ на вопрос