2012-06-05 14 views
5

Karıştırma modlu bir CIFilter oluşturmaya çalışıyorum (bindirme veya çarpma gibi). İlgili kod:Bir CIFolter içinde CIColor'dan CIImage kullanma: boş görüntü alma

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

Diğer filtreler (sepya tonu gibi) tamam çalışıyor ama bir "inputBackgroundImage" tuşuna gerektiren bir filtre ile, ben boş/boş bir sonuç almak ... öylesine bir şey yanlış gibi görünüyor arka plan resmim

Görüntü üzerine düz bir renk yerleştirerek karışım modu filtresini nasıl kullanırım?

+0

'-imageWithColor:' kullandığınızda 'overlay 'görüntünün doğru şekilde üretildiğini doğruladınız mı? Nil olmayan mı? Doğru görünen bir UIImage oluşturabilir misiniz? –

cevap

3

Bu çalışır:

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

Yayınınızın kalitesini artırmak için lütfen bu kodun sorunu nasıl/neden çözeceğini belirtin. –

5

konu hakeminin kodunda Onun tamam yalnızca bir düzeltme olmalıdır.

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]; 
İlgili konular