2012-06-05 7 views
5

ブレンドモード(オーバーレイや乗算など)でCIFilterを作成しようとしています。関連コード:CIFilterのCIImageをCIFilterで使用する:空のイメージを取得する

// 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]; 
関連する問題