2012-06-05 74 views
5

我试图用混合模式创建CIFilter(如叠加或乘法)。相关代码:在CIFilter中使用CIColor中的CIImage:获取空图像

// 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]; 

其它过滤器是好的工作(如棕褐色调),但需要一个“inputBackgroundImage”键过滤器,得到了一个空白/空的结果......所以有些事情似乎是错误的我的背景图片。

如何通过在图像上放置纯色来使用混合模式滤镜?

+0

您是否验证过使用'-imageWithColor:'正在生成'overlay'图像?它是否为零?你可以从它创建一个UIImage看起来正确吗? –

回答

3

这工作:

//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"]; 
+4

为了改善您的文章的质量,请包括此代码如何/为何解决问题。 –

5

其在主题起动器的代码还好,只有一个修补程序应该是。

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]; 
相关问题