किसी दिए गए बिंदु के लिए छवि के पिक्सेल रंग को प्राप्त करने के तरीके के बारे में कई प्रश्न/उत्तर हैं। हालांकि, इन सभी उत्तरों में बड़ी छवियों के लिए वास्तव में धीमी (100-500ms) हैं (उदाहरण के लिए 1000 x 1300 जितनी छोटी है)।आईओएस प्रदर्शन ट्यूनिंग: बड़ी छवियों के लिए पिक्सेल रंग प्राप्त करने का सबसे तेज़ तरीका
वहां अधिकांश कोड नमूने छवि संदर्भ में आकर्षित होते हैं। वे सब के सब समय था जब वास्तविक ड्रॉ जगह लेता ले:
CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, (CGFloat)width, (CGFloat)height), cgImage)
जांच उपकरण में यह पता चलता है कि ड्रॉ स्रोत छवि से डेटा कॉपी करके किया जा रहा है:
मेरे पास है यहां तक कि आंकड़ों को प्राप्त करने के एक अलग माध्यम की भी कोशिश की, उम्मीद है कि बाइट्स को प्राप्त करना वास्तव में अधिक कुशल साबित होगा।
NSInteger pointX = trunc(point.x);
NSInteger pointY = trunc(point.y);
CGImageRef cgImage = CGImageCreateWithImageInRect(self.CGImage,
CGRectMake(pointX * self.scale,
pointY * self.scale,
1.0f,
1.0f));
CGDataProviderRef provider = CGImageGetDataProvider(cgImage);
CFDataRef data = CGDataProviderCopyData(provider);
CGImageRelease(cgImage);
UInt8* buffer = (UInt8*)CFDataGetBytePtr(data);
CGFloat red = (float)buffer[0]/255.0f;
CGFloat green = (float)buffer[1]/255.0f;
CGFloat blue = (float)buffer[2]/255.0f;
CGFloat alpha = (float)buffer[3]/255.0f;
CFRelease(data);
UIColor *pixelColor = [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
return pixelColor;
इस विधि यह डेटा पर समय आ गया है लेता कॉपी:
CFDataRef data = CGDataProviderCopyData(provider);
ऐसा लगता है कि यह बहुत CGImage
उदाहरण मैं बनाने रहा हूँ के बजाय, डिस्क से डाटा पढ़ रही है:
अब, कुछ अनौपचारिक परीक्षणों में यह विधि बेहतर प्रदर्शन करती है, लेकिन यह अभी भी उतनी तेज नहीं है जितना मैं चाहता हूं। क्या किसी को अंतर्निहित पिक्सेल डेटा प्राप्त करने का एक तेज़ तरीका पता है ???
छवि को स्क्रीन पर चित्रित किया गया है, मुझे लगता है कि इसका पिक्सेल डेटा पहले ही स्मृति में कहीं है। –
ग्राफिक्स/जीपीयू/डिस्प्ले मेमोरी सीपीयू मेमोरी के समान नहीं है। आप डिस्प्ले की मेमोरी नहीं पढ़ सकते हैं। यह अपारदर्शी और ऐप के सैंडबॉक्स के बाहर है। – hotpaw2