2013-07-29 6 views
5

का उपयोग कर सभी काले पिक्सल पारदर्शी बनाएं I विशेष रूप से CIImage फ़िल्टर का उपयोग करके रंग मुखौटा के समान कुछ प्राप्त करने का प्रयास कर रहा हूं।सीआईएममेज

असल में, मैं सभी काले पिक्सेल पारदर्शी बनाने के लिए देख रहा हूं। मुझे कोई फर्क नहीं पड़ता कि सभी गैर-काले पिक्सेल का अंत क्या होता है, जब तक उनके पास अधिकतम अल्फा होता है।

कोड मैं प्राप्त करने के लिए इस विचार करेंगे में कोर ग्राफिक्स से परिचित हूँ की तरह:

// Convert black sections to transparent using a color mask 
const CGFloat maskingColors[6] = { 0, 0, 0, 0, 0, 0 }; 
CGImageRef result = CGImageCreateWithMaskingColors(image, maskingColors); 

मैं इसे मुख्य छवि में एक शॉट एक रंग मैट्रिक्स फिल्टर का उपयोग कर दिया है, लेकिन यह सिर्फ nil को result सेट चूंकि CIVector मान 1.0f से अधिक हैं।

// Create color matrix filter 
CIFilter *matrix = [CIFilter filterWithName:@"CIColorMatrix"]; 

// Set filter properties 
[matrix setValue:image forKey:kCIInputImageKey]; 
[matrix setValue:[CIVector vectorWithX:1.0f Y:0.0f Z:0.0f W:0.0f] forKey:@"inputRVector"]; 
[matrix setValue:[CIVector vectorWithX:0.0f Y:1.0f Z:0.0f W:0.0f] forKey:@"inputGVector"]; 
[matrix setValue:[CIVector vectorWithX:0.0f Y:0.0f Z:1.0f W:0.0f] forKey:@"inputBVector"]; 
[matrix setValue:[CIVector vectorWithX:255.0f Y:255.0f Z:255.0f W:0.0f] forKey:@"inputAVector"]; 

// Get the mapped image 
CIImage *result = [matrix valueForKey:kCIOutputImageKey]; 

नोट: के लिए क्या इसके लायक है, यह एक OSX एप्लिकेशन है।

+0

आप इसे एक की जरूरत है सरल समाधान या सबसे तेज़? मुझे एक बार ऐसी समस्या का सामना करना पड़ा है और मैं आपको फास्ट इमेज रीड्रा के लिए ओपनजीएल का उपयोग करने की सलाह देता हूं क्योंकि आप ऊपर पारदर्शी पिक्सल नहीं खींच सकते हैं। – Mehdzor

+0

अभी के लिए सरल समाधान, लेकिन यदि आपके पास ओपनजीएल पर संकेत हैं जो भी अच्छा होगा। आदर्श रूप में हमें इस प्रश्न के दायरे के लिए सीआईएममेज के भीतर सब कुछ रखना चाहिए (दूसरों की भी मदद करने के लिए)। –

+0

क्या आपने 'CIFILTER' 'CIMaskToAlpha' या' CIColorMap' 'पर एक नज़र डाली? –

उत्तर

5

संपादित

समाधान एक (सरल) कस्टम CIFilter का उपयोग कर। यह पद्धति केवल, पर OSX काम करता है आईओएस कस्टम फिल्टर का समर्थन नहीं करता है:

CIFilter उपवर्ग (कम या ज्यादा Apple's How-To की एक प्रति):

#import <QuartzCore/QuartzCore.h> 

@interface MaskFilter : CIFilter { 
    CIImage *inputImage; 
} 

@end 

@implementation MaskFilter 

static CIKernel *maskFilterKernel = nil; 

+ (void)initialize { 
    [CIFilter registerFilterName: @"MaskFilter" 
        constructor: (id)self 
       classAttributes: [NSDictionary dictionaryWithObjectsAndKeys: 
            @"Mask Filter", kCIAttributeFilterDisplayName, 
            [NSArray arrayWithObjects: 
            kCICategoryColorAdjustment, 
            kCICategoryStillImage, kCICategoryInterlaced, 
            kCICategoryNonSquarePixels,nil], kCIAttributeFilterCategories, 
            nil] 
    ]; 
} 

+ (CIFilter *)filterWithName:(NSString *)name { 
    CIFilter *filter; 
    filter = [[self alloc] init]; 
    return filter; 
} 

- (id)init { 
    if(maskFilterKernel == nil) { 
     NSBundle *bundle = [NSBundle bundleForClass:[self class]]; 
     NSString *code = [NSString stringWithContentsOfFile:[bundle pathForResource:@"MaskFilter" ofType: @"cikernel"] encoding:NSUTF8StringEncoding error:nil]; 
     NSArray *kernels = [CIKernel kernelsWithString:code]; 
     maskFilterKernel = [kernels objectAtIndex:0]; 
    } 
    return [super init]; 
} 

- (CIImage *)outputImage { 
    CISampler *src = [CISampler samplerWithImage: inputImage]; 
    return [self apply:maskFilterKernel, src, kCIApplyOptionDefinition, [src definition], nil]; 
} 

@end 

कस्टम कर्नेल जो सब काम (फ़ाइल का नाम है:

CIFilter *filter = [MaskFilter filterWithName:@"MaskFilter"]; 
[filter setValue:ciImage forKey:@"inputImage"]; 
CIImage *mask = [filter valueForKey: @"outputImage"]; 
: MaskFilter.cikernel)

kernel vec4 maskFilterKernel(sampler src) 
{ 
    vec4 t = sample(src, destCoord()); 
    t.w = (t.x == 0.0 ? (t.y == 0.0 ? (t.z == 0.0 ? 0.0 : 1.0) : 1.0) : 1.0); 
    return t; 
} 

फ़िल्टर का उपयोग कर की तरह ही एक निर्माण में फ़िल्टर काम करता है

मास्क-रंग के रूप में उपयोग करने के लिए रंग चुनने के लिए पैरामीटर जोड़ना कोई समस्या नहीं होनी चाहिए।

पुराने उत्तर

अंतर्निहित तरीकों और वर्गों के साथ

, मैं सिर्फ इस बल्कि unelegant समाधान के साथ आ सकते हैं (जो केवल मुख्य छवि फिल्टर का उपयोग करता है):

// convert all colors so they are brighter or equal to 0.5, except black 
CIFilter *binary = [CIFilter filterWithName:@"CIColorMatrix"]; 
[binary setValue:inputImage forKey:@"inputImage"]; 
[binary setValue:[CIVector vectorWithX:1 Y:1 Z:1 W:0] forKey:@"inputRVector"]; 
[binary setValue:[CIVector vectorWithX:1 Y:1 Z:1 W:0] forKey:@"inputGVector"]; 
[binary setValue:[CIVector vectorWithX:1 Y:1 Z:1 W:0] forKey:@"inputBVector"]; 
[binary setValue:[CIVector vectorWithX:0.49999 Y:0.49999 Z:0.49999 W:0] forKey:@"inputBiasVector"]; 
inputImage = [binary valueForKey:@"outputImage"]; 

// convert to black/white only colors 
binary = [CIFilter filterWithName:@"CIColorPosterize"]; 
[binary setDefaults]; 
[binary setValue:inputImage forKey:@"inputImage"]; 
[binary setValue:@2 forKey:@"inputLevels"]; 
inputImage = [binary valueForKey:@"outputImage"]; 

// get mask 
CIFilter *mask = [CIFilter filterWithName:@"CIMaskToAlpha"]; 
[mask setDefaults]; 
[mask setValue: inputImage forKey:@"inputImage"]; 
+0

धन्यवाद दोस्त! कस्टम फ़िल्टर मेरे लिए संभावनाओं की दुनिया खोल रहे हैं :) एक कस्टम फ़िल्टर बनाने के तरीके पर कोई संकेत जो CIAreaMaximumAlpha जैसे सिंगल-पिक्सेल परिणाम आउटपुट करता है? –

+0

आप अपने इनपुट आकार से अलग कुछ मिलान करने के लिए आउटपुट आकार को परिभाषित कर सकते हैं।लेकिन जैसा कि कोर इमेज गतिशील लूप का समर्थन नहीं करता है (केवल संकलन-समय की स्थितियों के साथ लूप) आपको चरणों के बीच सूचना हानि के बिना कुछ स्मार्ट कम करने के बारे में सोचना होगा। [इस आलेख खंड 26.2.2] पर एक नज़र डालें (http://http.developer.nvidia.com/GPUGems3/gpugems3_ch26.html) –

संबंधित मुद्दे