के लिए पिक्सेल अल्फा मान पुनर्प्राप्त करना मैं वर्तमान में UIImageView में पिक्सेल के अल्फा मान को प्राप्त करने का प्रयास कर रहा हूं। मैंने [UIImageView छवि] से CGImage प्राप्त किया है और इससे एक आरजीबीए बाइट सरणी बनाई है। अल्फा premultiplied है।UIImage
CGImageRef image = uiImage.CGImage;
NSUInteger width = CGImageGetWidth(image);
NSUInteger height = CGImageGetHeight(image);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
rawData = malloc(height * width * 4);
bytesPerPixel = 4;
bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(
rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big
);
CGColorSpaceRelease(colorSpace);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), image);
CGContextRelease(context);
मैं तो UIImageView से निर्देशांकों का उपयोग कर दिया अल्फ़ा चैनल के लिए सरणी सूचकांक की गणना।
int byteIndex = (bytesPerRow * uiViewPoint.y) + uiViewPoint.x * bytesPerPixel;
unsigned char alpha = rawData[byteIndex + 3];
हालांकि मुझे उम्मीदों की अपेक्षा नहीं है। छवि के पूरी तरह से काले पारदर्शी क्षेत्र के लिए मुझे अल्फा चैनल के लिए शून्य-शून्य मान प्राप्त होते हैं। क्या मुझे UIKit और कोर ग्राफिक्स के बीच समन्वय का अनुवाद करने की आवश्यकता है - i.e: क्या y-axis उलटा हुआ है? या क्या मैंने पूर्ववर्ती अल्फा मूल्यों को गलत समझा है?
अद्यतन:
@Nikolai Ruhe के सुझाव यह करने के लिए महत्वपूर्ण था। मुझे वास्तव में UIKit निर्देशांक और कोर ग्राफिक्स निर्देशांक के बीच अनुवाद करने की आवश्यकता नहीं थी।
CGContextSetBlendMode(context, kCGBlendModeCopy);
अरे तेबोट - मुझे एहसास है कि इस प्रश्न का उत्तर पहले से ही दिया गया है, लेकिन मैं कुछ दिनों पहले ऐसा कुछ कर रहा था। पूरी छवि को चित्रित करने और फिर बाइट सरणी में अनुक्रमणित करने के बजाय, आपको स्रोत छवि के 1px को 1px में 1px बिटमैप संदर्भ_ में खींचना चाहिए। आप सही पिक्सेल को रखने के लिए CGContextDrawImage में rect पैरामीटर का उपयोग कर सकते हैं, और यह 1000 गुना तेज है :-) –
टिप्पणी के लिए धन्यवाद @ बेन गोटो - मैं केवल एक बार छवि खींचता हूं और फिर उसी बाइट सरणी का उपयोग करता रहता हूं। @ निकोलई रुहे ने एकल पिक्सेल ड्रॉ का भी सुझाव दिया लेकिन कहा कि अगर मुझे छवि को एक से अधिक बार आकर्षित करने की आवश्यकता नहीं है, तो मेरे सरणी दृष्टिकोण तेज होंगे, लेकिन अल्फा को बार-बार देखने की आवश्यकता है। – teabot
इस समस्या का उपयोग करने के बाद बस एक त्वरित अपडेट (बाद में) और इसी तरह की समस्या के लिए यहां एक और प्रश्न: CGContextDrawImage पर रेक्ट पैरामीटर का उपयोग "बाउंडिंग बॉक्स के उपयोगकर्ता स्थान में स्थान और आयाम को नियंत्रित करने के लिए किया जाता है जिसमें छवि को आकर्षित करने के लिए किया जाता है। " इसलिए, यदि आप उस आयत 1x1 आकार में बनाते हैं, तो यह चित्र खींचने से पहले पूरी छवि को 1x1 तक स्केल करेगा। सही पिक्सेल प्राप्त करने के लिए आपको निकोलई के उत्तर में CGContextTranslateCTM का उपयोग करने की आवश्यकता है, और स्केलिंग को रोकने के लिए स्रोत छवि के बराबर आय का आकार छोड़ दें। – roguenet