在CIFilter中使用来自CIColor的CIImage:获取空图像
我正在尝试使用混合模式创buildCIFilter(如叠加或乘法)。 相关代码:
// 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];
其他滤镜工作正常(像棕褐色调),但与filter,需要一个“inputBackgroundImage”键,我得到一个空白/空的结果…所以有些东西似乎是错误的,我的背景图像。
如何通过在图像上放置纯色来使用混合模式滤镜?
它可以在主题启动的代码,只有一个修复应该是。
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];
这工作:
//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"];