2012-06-26 7 views
8

सहेज लिया गया है मैं ऑब्जेक्टिव-सी में UIImages की तुलना जब एक छवि पहले से ही एक को बचाने और लोड की प्रक्रिया NSSearchPathForDirectoriesInDomains विधि का उपयोग कर के माध्यम से किया गया है के बारे में एक सवाल है के खिलाफ एक छवि की तुलना करना।ऑब्जेक्टिव-सी: एक और छवि है कि पहले

जो मैं चाहता का उद्देश्य क्या छवि प्रदर्शित करता है के आधार पर एक क्लिक करने पर एक नए स्क्रीन करने के लिए उपयोगकर्ता में भेजना है। एक काले रंग की छवि और एक हरे रंग की छवि -

सरलता के लिए मान लीजिए कि दो संभावनाएं देखते हैं कि चलो। ब्लैक इमेज पर क्लिक करने से आपको xib1 पर ले जाता है और हरी छवि पर क्लिक करने से आपको xib2 पर ले जाता है।

यह काफी सरल है और जब तक मैं एक को बचाने और लोड प्रणाली को लागू किया है काम कर रहा है।

मैं कर बचाने के लिए निम्नलिखित:

paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
documentsDirectory = [paths objectAtIndex:0]; 
pngFilePath = [NSString stringWithFormat:@"%@/test.png",documentsDirectory]; 
data1 = [NSData dataWithData:UIImagePNGRepresentation([level1part1 objectAtIndex:0])]; 
[data1 writeToFile:pngFilePath atomically:YES]; 

और मैं निम्न कार्य लोड करने के लिए:

paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
documentsDirectory = [paths objectAtIndex:0]; 
pngFilePath = [NSString stringWithFormat:@"%@/test.png",documentsDirectory]; 
UIImage *image = [UIImage imageWithContentsOfFile:pngFilePath]; 
[button1 setImage:image forState:UIControlStateNormal]; 

यह ठीक है और जब मैं इस कार्यक्रम से बाहर निकलें और उसे पुन: प्रारंभ छवि पर बनाए रखा है स्क्रीन जैसा मैं चाहता हूं। Hypothetically मान लें कि बटन 1 पर दिखाई देने वाली छवि हरी छवि है। (Button1 यह है)

जब मैं इस की आईडी के साथ बटन पर क्लिक करने के बाद निम्नलिखित कोड फोन:

if(sender.currentImage == [UIImage imageNamed:self.greenImage]) 
{ 
    VisitAlreadyCorrectScreen *screen = [[VisitAlreadyCorrectScreen alloc] initWithNibName:nil bundle:nil]; 
    screen.modalTransitionStyle = UIModalTransitionStyleCoverVertical; 
    [self presentModalViewController:screen animated:YES]; 
} 

भले ही currentImage हरी छवि है और हरे रंग की छवि मैं रूप में एक ही तस्वीर है यह करने के लिए की तुलना कर रहा हूँ, मुझे लगता है कि क्योंकि मैं बचाने की प्रक्रिया तुलना काम नहीं करता है के रूप में वे स्मृति में विभिन्न स्थानों में आयोजित की जाती हैं में स्मृति में हरे रंग की छवि को बचाया - सत्यापित निम्नलिखित NSLog द्वारा:

Current Image: <UIImage: 0x95614c0>, and Yes Image: <UIImage: 0xde748f0> 

मैं दो छवियों की तुलना करने के तरीके को कैसे काम नहीं कर सकता है कि इस मामले में वे मेल खाते हैं (वे दोनों संसाधन फ़ोल्डर में मेरे पास एक ही छवि से संबंधित हैं)। क्या किसी के पास कोई सुझाव है?

कृपया मुझे बताएं कि क्या मैंने समस्या को ठीक से समझाया नहीं है!

अग्रिम धन्यवाद!

+0

यदि आपको 100% पिक्सेल-बाय-पिक्सेल तुलना की आवश्यकता नहीं है, तो आप इसका उपयोग कर सकते हैं, जो पॉल एन के समाधान से लगभग 50 गुना तेज है: http://stackoverflow.com/a/19668235/423171 – cprcrack

+0

यह हो सकता है कुछ पहचानकर्ता क्षेत्रों को जोड़ने और तरीकों की तुलना करने के लिए UIImage को विस्तारित करने पर विचार करने योग्य होना चाहिए। (सुनिश्चित नहीं है कि UIImage को कितना खुश किया जाना है।) –

उत्तर

25

आप छवि नाम या चित्र URL अगर यह इंटरनेट से डाउनलोड किया गया था की तुलना कर सकते, यह भी छवियों की तुलना की तुलना में तेजी हो जाएगा।

इसके अलावा, समस्या यह है कि == ऑपरेटर का उपयोग करके आप 0x95614c0 और 0xde748f0 छवियों के स्मृति पते की तुलना कर रहे हैं। यही कारण है कि बराबर नहीं है। आप तुलना कर रहे हैं कि वे एक ही वस्तु हैं, न कि छवियों के बराबर हैं।

छवियों की तुलना करने के लिए उपयोग करें: जैसा कि Fls'Zen उत्तर पर बताया गया है।

if ([UIImagePNGRepresentation(blackImage) isEqualToData:UIImagePNGRepresentation(greenImage)]) 
+0

हाय पॉल - आपके उत्तर के लिए धन्यवाद - मैंने टैग्स का उपयोग विभिन्न छवियों के बीच पहचानने के लिए किया है जो मेरी छवियों को पकड़ते हैं और यह ठीक काम करता है लेकिन क्या आप एक छवि भी टैग कर सकते हैं? साथ ही, आपके द्वारा प्रदान किया गया कोड मैंने पहले से ही मेरे कोड में कोई फायदा नहीं लिया है - अभी भी यह पहचान नहीं रहा है कि वे वही हैं। – user1309044

+0

आप सही हैं, आप अनुमान लगा सकते हैं कि मैंने खुद को ImageView से भ्रमित कर दिया है, मैंने यह भी पुष्टि की है कि इक्वल विधि छवियों के लिए काम नहीं करती है क्योंकि यह ऑब्जेक्ट के पॉइंटर की तुलना भी करती है, मैं आपको गलत दिशा में इंगित करने के लिए क्षमा चाहता हूं , मैंने छवियों की तुलना करने के लिए मिलने वाली एकमात्र विधि के साथ अपना उत्तर अपडेट किया। –

+0

चिंता न करें पॉल - पहली जगह में प्रतिक्रिया के लिए सराहना करता हूं! – user1309044

4

आपकी छवियों निश्चित रूप से अलग-अलग पतों के बाद से एक अपने आवेदन बंडल से भरी हुई है और एक दस्तावेज निर्देशिका से भरी हुई है है। [UIImage imageNamed:] फ़ंक्शन केवल एप्लिकेशन बंडल से छवियां देता है।

यदि आप वास्तव में सामग्री द्वारा छवियों की तुलना करना चाहते हैं, तो this SO प्रश्न देखें। पहले जवाब में, एक छवि के लिए एक हैश मान गणना की गई है। अपने कोड में, आप दो छवियों के हैश मानों की तुलना कर सकते हैं।दूसरा जवाब सीधे छवियों की तुलना करता है, यदि हैश आपको परेशान कर देता है।

मैं एक अलग मार्ग पर जाने की सलाह देता हूं और अपना एप्लिकेशन ट्रैक करता हूं कि छवि छवि के बाहर कौन सी छवि लोड हो जाती है।

+1

हाय फ़्ल्सज़ेन - आपके उत्तर के लिए धन्यवाद। मैंने आपके द्वारा उल्लिखित लिंक पर एक नज़र डाली थी और पहली विधि काफी मामूली कार्य के लिए काफी असाधारण लगती थी (जिसे मुझे कई बार दोहराना पड़ता था) मैंने दूसरी विधि का प्रयास किया जिसने आपने मुझे भी बताया जो दुर्भाग्य से काम नहीं करता या तो (वे मेल नहीं खाते)। मैं बस एक बूल या बाइनरी सरणी बना सकता हूं जो जब भी छवि बदलता है और उस चर के मान पर मेरी क्रिया का आधार बनाता है। मैं सवाल खुलता रहूंगा कि किसी के पास कोई और जवाब है - प्रतिक्रिया के लिए धन्यवाद इसकी बहुत सराहना की गई है! – user1309044