2012-03-11 9 views
9

मैंने एक ऐसा एप्लिकेशन बनाया है जो फ़ोटो शूट करता है और सहेजता है। मेरे पास उस पूर्वावलोकन के शीर्ष पर एक पूर्वावलोकन और ओवरले है। हैएंड्रॉइड कैमरा - मैं बाइट सरणी से एक विशिष्ट "आयताकार" कैसे ले सकता हूं?

example

मैं क्या करने की जरूरत छवि के हिस्से को निकालने के लिए: ओवरले एक वर्ग (वर्ग के आसपास के क्षेत्र पूर्वावलोकन थोड़ा गहरे रंग दिखाता है) को परिभाषित करता है, जैसा कि आप छवि में देख सकते हैं जहां वर्ग है। वर्ग इस तरह परिभाषित किया गया है:

Rect frame = new Rect(350,50,450,150); 

मैं कैसे कर सकते हैं कि? मेरे पास बाइट सरणी (बाइट [] डेटा है) जिसे मैं सहेज सकता हूं, लेकिन मैं एप्लिकेशन को बदलना चाहता हूं ताकि केवल वर्ग क्षेत्र बचाया जा सके।

संपादित करें: मैं निम्नलिखित की कोशिश की है:

int[] pixels = new int[100000]; 
      ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
      Bitmap bitmap = BitmapFactory.decodeByteArray(data , 0, data.length); 
      bitmap.getPixels(pixels, 0, 480, 350, 50, 100, 100); 
      bitmap = Bitmap.createBitmap(pixels, 0, 100, 100, 100, Config.ARGB_4444); 
      bitmap.compress(CompressFormat.JPEG, 0, bos); 
      byte[] square = bos.toByteArray(); 

और फिर सरणी "वर्ग" एक नया फ़ाइल पर लिखने ... समस्या यह है कि मैं लाइनों से बना एक तस्वीर मिल ... है परिवर्तन के साथ एक समस्या है जिसे मैंने

+0

महाकाव्य के रूप में सरल उपाय ... http://stackoverflow.com/a/17733530/294884 – Fattie

+0

@Eyal आप तो सिर्फ आयत क्षेत्र को बाइट [] से फसल के बिना फसल करना चाहते हैं? – ashishdhiman2007

उत्तर

8

यह मुझे कुछ समय लगा यह पता लगाने की है कि कोड इस तरह दिखना चाहिए:

int[] pixels = new int[100*100];//the size of the array is the dimensions of the sub-photo 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     Bitmap bitmap = BitmapFactory.decodeByteArray(data , 0, data.length); 
     bitmap.getPixels(pixels, 0, 100, 350, 50, 100, 100);//the stride value is (in my case) the width value 
     bitmap = Bitmap.createBitmap(pixels, 0, 100, 100, 100, Config.ARGB_8888);//ARGB_8888 is a good quality configuration 
     bitmap.compress(CompressFormat.JPEG, 100, bos);//100 is the best quality possibe 
     byte[] square = bos.toByteArray(); 
3

कैमरा पूर्वावलोकन डेटा वाईयूवी प्रारूप (विशेष रूप से ImageFormat.NV21) में आता है, जो बिटमैप फैक्टरी सीधे समर्थन नहीं करता है। आप here वर्णित के रूप में इसे बिटमैप में बदलने के लिए युवराज का उपयोग कर सकते हैं। केवल अंतर यह है कि आप YuvImage.compressToJpeg को कॉल करते समय इच्छित वर्ग के अनुरूप एक रेक्ट पारित करना चाहते हैं।

+0

हाय, मदद के लिए धन्यवाद, मैंने युवराज का उपयोग करने की कोशिश की है लेकिन परिणाम गन्दा था और संपीड़न के बाद मुझे रंगीन बिंदुओं से भरा स्क्रीन मिली ... – Eyal

संबंधित मुद्दे