2012-11-18 13 views
7

मैं एंड्रॉइड में कुछ छवि प्रसंस्करण करने की कोशिश कर रहा हूं। मुझे बिटमैप की पिक्सेल जानकारी का एक हिस्सा प्राप्त करने की आवश्यकता है। इसलिए मैंने बिटमैप क्लास विधि getPixels() में से किसी एक का उपयोग करने का प्रयास किया। हालांकि, ऐसा लगता है कि मैं इसे सही तरीके से उपयोग नहीं कर रहा हूं या मैंने विधि के व्यवहार के एकमात्र उद्देश्य को गलत समझा।एंड्रॉइड के बिटमैप क्लास के getPixels() का उपयोग और इसका उपयोग कैसे करें

उदाहरण के लिए, मैं एक मनमानी स्थान (बिटमैप समन्वय) x, y से बिटमैप के 10 से 10 क्षेत्र की पिक्सेल जानकारी प्राप्त करने के लिए निम्न कार्य कर रहा हूं।

Bitmap bitmap = BitmapFactory.decodeFile(filePath); 
int[] pixels = new int[100]; 
bitmap.getPixels(pixels, 0, bitmap.getWidth(), x, y, 10, 10); 

और मुझे ArrayIndexOutOfBoundsException मिल रहा है। मैं यह देखने के लिए चारों ओर गुगल रहा हूं कि मैं क्या गलत कर रहा हूं, लेकिन मैं अनजान हूं। getPixels() के उपयोग से संबंधित अधिकांश उदाहरण या प्रश्न आमतौर पर संपूर्ण छवि की पिक्सेल जानकारी निकालने के मामले में होते हैं। इसलिए int सरणी का आकार आमतौर पर bitmap.getWidth() * bitmap.getHeight(), x और y मान 0, 0, और चौड़ाई है, ऊंचाई बिटमैप की चौड़ाई और ऊंचाई है।

क्या बिटमैप के getPixels() को मेरे उपयोग के उद्देश्य के लिए डिज़ाइन नहीं किया गया है (बिटमैप के उप-क्षेत्र की पिक्सेल जानकारी का एक हिस्सा प्राप्त करना)? या क्या मैं इसे गलत तरीके से उपयोग कर रहा हूं? क्या ऐसा करने का कोई वैकल्पिक तरीका है, शायद एक अलग वर्ग का उपयोग कर?

अगर किसी के पास इसके बारे में कुछ कहना है तो मैं इसकी सराहना करता हूं। धन्यवाद।

उत्तर

4

getPixels() स्रोत बिटमैप की पूर्ण int [] सरणी देता है, इसलिए स्रोत बिटमैप की ऊंचाई x चौड़ाई के समान लंबाई के साथ प्रारंभ किया जाना चाहिए।

ऐसा करने के लिए, bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, 10, 10); वास्तव में बिटमैप से वांछित पिक्सल को पकड़ता है, और शेष सरणी को 0 के साथ भरता है। इसलिए 100 x 10 के बिटमैप के 10 x 10 सबसेट के साथ, 0,0 से शुरू होता है पहले 100 मूल्यों वांछित पूर्णांक मान होगा, बाकी 0.

आप हमेशा अपने सबसेट बिटमैप बनाने के लिए और फिर अपने नए बिटमैप पर getPixels() का उपयोग पूरी सरणी हड़पने के लिए Bitmap.createBitmap() का उपयोग कर की कोशिश कर सकते हो जाएगा।

+0

हालांकि मैं काफी तथ्य यह है कि getPixels() हमेशा संपूर्ण स्रोत बिटमैप की सरणी आकार रिटर्न से हैरान हूँ, आपकी सहायक सलाह के लिए धन्यवाद। –

+1

गति के संदर्भ में getPixel से बेहतर पिक्सिक्स का उपयोग कर रहा है? –

+0

मैं वर्ष 2017 से हूं और अब मुझे यकीन नहीं है कि यह पूरे बिटमैप को वापस कर देता है। मैंने पिक्सेल सरणी के आकार को स्ट्रैड * हेग्नट वैल्यू (पैरामीटर पाने के लिए पारित पैरामीटर) पर सेट करने का प्रयास किया और यह काम किया। मुझे यह मूल्य कभी-घटते पिक्सल सरणी आकार के लूप का उपयोग करके परीक्षण करके मिला है – FrinkTheBrave

3

अधिकांश लोग getPixels() को एक विशिष्ट क्षेत्र पिक्सल प्राप्त करना चाहते हैं, लेकिन वास्तव में यह मूल बिटमैप का पूर्ण आकार लौटाता है। मान्य क्षेत्र बाएं कोने में रखा गया है और अन्य पारदर्शी रंग हैं। मेरा सुझाव है कि आप बिटमैप बनाकर दृश्य पिक्सेल देखने के लिए एंड्रॉइड स्टूडियो डीबग मोड का उपयोग करें।

और पीछा कर रहा है getPixels की मेरी संस्करण() विशिष्ट क्षेत्र पिक्सल प्राप्त करने के लिए:

public class BitmapHelper { 

public static int[] getBitmapPixels(Bitmap bitmap, int x, int y, int width, int height) { 
    int[] pixels = new int[bitmap.getWidth() * bitmap.getHeight()]; 
    bitmap.getPixels(pixels, 0, bitmap.getWidth(), x, y, 
      width, height); 
    final int[] subsetPixels = new int[width * height]; 
    for (int row = 0; row < height; row++) { 
     System.arraycopy(pixels, (row * bitmap.getWidth()), 
       subsetPixels, row * width, width); 
    } 
    return subsetPixels; 
} 
} 
संबंधित मुद्दे