2012-06-05 9 views
10

क्या UIImage को विलुप्त करने के लिए आईओएस 5.x में कोई आसान तरीका (या एक अंतर्निहित लाइब्रेरी) है? यहां वर्तमान में मैं इसे कैसे कर रहा हूं:मैं यूआईएममेज को कैसे निराश करूं?

CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSaveGState(context); 

    CGContextTranslateCTM(context, 0.0, self.bounds.size.height); // flip image right side up 
    CGContextScaleCTM(context, 1.0, -1.0); 

    CGContextDrawImage(context, rect, self.image.CGImage); 
    CGContextSetBlendMode(context, kCGBlendModeSaturation); 
    CGContextClipToMask(context, self.bounds, image.CGImage); // restricts drawing to within alpha channel 
    CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, desaturation); 
    CGContextFillRect(context, rect); 

    CGContextRestoreGState(context); // restore state to reset blend mode 

ऐसा लगता है कि यह अपेक्षाकृत थोड़ा अधिक जटिल लगता है। क्या इससे कोई आसान तरीका है?

मैं कोर छवि के बारे में सोच रहा था, लेकिन मुझे इसका उपयोग करके एक छवि को विलुप्त करने के तरीके पर एक ठोस उदाहरण नहीं दिख रहा है।

+0

सुनिश्चित नहीं है, लेकिन संभवतः आप [सीआईएफलेटर] (http://developer.apple.com/library/ios/#DOCUMENTATION/GraphicsImaging/Reference/QuartzCoreFramework/Classes/CIFilter_Class/Reference/Reference.html) को लागू करने का प्रयास कर सकते हैं [kCICategoryColorEffect] (http://developer.apple.com/library/ios/DOCUMENTATION/GraphicsImaging/Reference/QuartzCoreFramework/Classes/CIFilter_Class/Reference/Reference.html#//apple_ref/doc/c_ref/kCICategoryColorEffect) प्रकार। त्वरित डेमो कैसे लागू करें CIFilter: http://iazapps.wordpress.com/2012/02/01/applying-cifilter-on-image-in-an-uiimageview/ –

+0

desaturation के लिए आपका मूल्य क्या है ??? – malhal

+0

indiekiduk, यह कोड यहां एक उत्तर में अधिक संदर्भ में दिखाई देता है: http://stackoverflow.com/questions/1144768/how-can-i-change-the-saturation-of-an-uiimage (desaturation में एक ivar है उदाहरण)। – JLundell

उत्तर

21

आप कोड की दो या तीन पंक्तियों का उपयोग कर GPUImage ढांचे मेरी खुला स्रोत के साथ ऐसा कर सकते हैं:

UIImage *inputImage = [UIImage imageNamed:@"inputimage.png"];  
GPUImageGrayscaleFilter *grayscaleFilter = [[GPUImageGrayscaleFilter alloc] init]; 
UIImage *grayscaleImage = [grayscaleFilter imageByFilteringImage:inputImage]; 

यह करने के लिए छवि को कम कर देता है (यदि एआरसी का उपयोग कर निर्माण नहीं फिल्टर रिलीज करने के लिए याद) इसके चमकदार मूल्य, इसे desaturating। यदि आप परिवर्तनीय संतृप्ति/desaturation चाहते हैं, तो आप एक GPUImageSaturationFilter का उपयोग कर सकते हैं। चूंकि ढांचे का नाम इंगित करता है, यह फ़िल्टरिंग जीपीयू पर चलता है, और लगभग हर स्थिति में कोर छवि से तेज़ है जिसे मैंने 5.1 के रूप में आईओएस पर बेंचमार्क किया है।

+0

बाद में बुकमार्क करना! अच्छा – box86rowh

+0

ब्रैड इस छवि को असंतृप्त करने के बाद मूल रंगों के साथ फिर से संतृप्त करने का एक तरीका है? वर्तमान में यह एक तरफा यात्रा की तरह लगता है जब आप GPUImage का उपयोग करके एक छवि को विलुप्त करते हैं। क्या मूल छवि की प्रतिलिपि केवल एक ही समाधान है? मैं अधिक विनाशकारी संतृप्ति समायोजन परत की तरह एक और फ़ोटोशॉप की उम्मीद कर रहा था: पी – Zhang

+0

@Zhang - नहीं, अगर आप मूल रंगीन छवि चाहते हैं तो आपको इसे आसपास रखना होगा, क्योंकि विलुप्त होने में जानकारी खो जाती है। आपके चित्रों और फ़िल्टरों के लिए आपके पास एकाधिक लक्ष्य हो सकते हैं, हालांकि, आप desaturation करने से पहले एक दूसरे प्रोसेसिंग पथ को विभाजित कर सकते हैं। फ़ोटोशॉप के अनौपचारिक फ़िल्टर मूल छवि की प्रतियों को काम करने के लिए रखते हैं। –