2012-02-01 8 views
10

से UIImage बनाना I छवि को संसाधित करने के लिए कुछ कोरइमेज फ़िल्टर का उपयोग कर रहा हूं। मेरे इनपुट छवि परिणामों में फ़िल्टर को लागू करने के लिए फ़िल्टर आउटपुट इमेज नामक आउटपुट छवि में CIImage टाइप करें।सीआईएममेज

मैं अब उस छवि को प्रदर्शित करना चाहते हैं, और करने की कोशिश की कर रही है:

self.modifiedPhoto = [UIImage imageWithCIImage:filterOutputImage]; 
self.photoImageView.image = self.modifiedPhoto; 

दृश्य तथापि खाली है - कुछ भी नहीं दिखाई जा रही है।

यदि मैं लॉगिंग स्टेटमेंट जोड़ता हूं जो फ़िल्टरऑटपुट इमेज और self.modifiedPhoto दोनों के बारे में विवरण प्रिंट करता है, तो उन लॉगिंग स्टेटमेंट्स मुझे दिखा रहे हैं कि उन दोनों वर्रों में वैध छवि डेटा शामिल है: उनके आकार की सूचना दी जा रही है और ऑब्जेक्ट्स शून्य नहीं हैं।

तो कुछ गूगलिंग करने के बाद, मुझे एक समाधान मिला जो एक CGImage मंच के माध्यम से जाने की आवश्यकता है; विज़:

CGImageRef outputImageRef = [context createCGImage:filterOutputImage fromRect:[filterOutputImage extent]]; 
self.modifiedPhoto = [UIImage imageWithCGImage:outputImageRef scale:self.originalPhoto.scale orientation:self.originalPhoto.imageOrientation]; 
self.photoImageView.image = self.modifiedPhoto; 
CGImageRelease(outputImageRef); 

यह दूसरा दृष्टिकोण से काम करता है: मैं दृश्य में प्रदर्शित सही छवि हो रही है।

क्या कोई मुझे बता सकता है कि मेरा पहला प्रयास क्यों विफल हुआ? मैं ImageWithCIImage विधि के साथ क्या गलत कर रहा हूं जिसके परिणामस्वरूप एक छवि मौजूद है जो प्रदर्शित होने पर प्रदर्शित नहीं हो सकती है? क्या सीआईएममेज से यूआईएममेज उत्पन्न करने के लिए सीजीआईमेज चरण को "पार करना" हमेशा आवश्यक है?

उम्मीद किसी ने मेरे भ्रम की स्थिति :)

एच

उत्तर

8

स्पष्ट कर सकते हैं मुझे लगता है कि self.photoImageView एक UIImageView है? यदि हां, तो अंततः, यह UIImage पर -[UIImage CGImage] पर कॉल करने जा रहा है और उसके बाद उस CGImage को CALayer की contents संपत्ति के रूप में पास कर देगा।

(टिप्पणियां देखें: अपने विवरण गलत थे)

प्रति UIImage प्रलेखन -[UIImage CGImage] के लिए:

If the UIImage object was initialized using a CIImage object, the 
value of the property is NULL. 

तो UIImageView -CGImage कहता है, लेकिन है कि शून्य में जो परिणाम, इसलिए कुछ भी प्रदर्शित होता है।

मैं इस प्रयास नहीं किया है, लेकिन आप -[UIView drawRect:] में UIImage के -draw... तरीकों का उपयोग कर CIImage आकर्षित करने के लिए एक कस्टम UIView बनाने और उसके बाद की कोशिश कर सकते।

+0

आह! धन्यवाद। हां, फोटो इमेज व्यू एक UIImageView है। मुझे नहीं पता था कि यह UIImage की CGImage संपत्ति का उपयोग करता था। – Hamster

+0

एक और सवाल, जिसमें दस्तावेज़ में यह बताया गया है कि UIImageView अपनी छवि को कैसे प्रदर्शित करता है? मैं यह पता लगाने की कोशिश कर रहा हूं कि आपने कहां से सीखा है :) – Hamster

+0

दरअसल, अब मैं वास्तव में बाइनरी कोड को देखता हूं: UIImageView ओवरराइड-ड्राउरक्ट: सेटकंट्स को कॉल करने के बजाए: अपने स्वयं के कैलियर पर। ऐसा लगता है कि अंततः यूआईएममेज ड्रॉ विधियों में कॉल किया जाता है, जो CGImageRef को पकड़ते हैं और इसे आकर्षित करते हैं। तो, एक ही परिणाम, लेकिन मेरे विवरण गलत थे। – iccir

15

यह करना चाहिए!

-(UIImage*)makeUIImageFromCIImage:(CIImage*)ciImage 
{ 
    self.cicontext = [CIContext contextWithOptions:nil]; 
    // finally! 
    UIImage * returnImage; 

    CGImageRef processedCGImage = [self.cicontext createCGImage:ciImage 
                 fromRect:[ciImage extent]]; 

    returnImage = [UIImage imageWithCGImage:processedCGImage]; 
    CGImageRelease(processedCGImage); 

    return returnImage; 
}