2013-04-09 10 views
5

मैंने इस (नीचे) कोड का उपयोग करके एसडी कार्ड पर एक तस्वीर से बेस 64 स्ट्रिंग बनाई है, और यह काम करता है लेकिन जब मैं इसे डीकोड करने की कोशिश करता हूं (यहां तक ​​कि नीचे भी) मुझे java.lang.outOfMemoryException मिलता है, संभवतः क्योंकि मैं मैं इसे डीकोड करने से पहले स्ट्रिंग को एक उचित आकार में विभाजित नहीं कर रहा हूं क्योंकि मैं इसे एन्कोड करने से पहले हूं।डीकोड बड़े बेस 64 स्ट्रिंग

byte fileContent[] = new byte[3000]; 
StringBuilder b = new StringBuilder(); 
try{ 
    FileInputStream fin = new FileInputStream(sel); 
    while(fin.read(fileContent) >= 0) { 
    b.append(Base64.encodeToString(fileContent, Base64.DEFAULT)); 
    } 
}catch(IOException e){ 

} 

उपरोक्त कोड अच्छी तरह से काम करता है, लेकिन समस्या तब आती है जब मैं निम्न कोड के साथ छवि को डीकोड करने का प्रयास करता हूं;

byte[] imageAsBytes = Base64.decode(img.getBytes(), Base64.DEFAULT); 
ImageView image = (ImageView)this.findViewById(R.id.ImageView); 
image.setImageBitmap(
    BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length) 
); 

मैं इस तरह की कोशिश की है भी

byte[] b = Base64.decode(img, Base64.DEFAULT); 
Bitmap bitmap = BitmapFactory.decodeByteArray(b, 0, b.length); 
image.setImageBitmap(bitmap); 

अब मुझे लगता है कि मैं मेरी छवि एन्कोडिंग कोड की तरह वर्गों में स्ट्रिंग विभाजित करने की आवश्यकता है, लेकिन मैं कोई सुराग नहीं कैसे यह करने के बारे में जाना है ।

उत्तर

13

आपको पृष्ठभूमि थ्रेड में छवि को डीकोड करने की आवश्यकता है जैसे AsyncTask या आपको बिटमैप फैक्टरी का उपयोग करके अपनी छवि गुणवत्ता को कम करने की आवश्यकता है। उदाहरण:

BitmapFactory.Options options = new BitmapFactory.Options(); 

      options.inSampleSize = 2; 
      options.inPurgeable=true; 
     Bitmap bm = BitmapFactory.decodeFile("Your image exact loaction",options); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); //bm is the bitmap object 

     byte[] b = baos.toByteArray(); 
     String encodedImage = Base64.encodeToString(b, Base64.DEFAULT); 
+0

यह एक शानदार समाधान है! यह पूरी तरह से काम करता है – jcw

1

आप दो समस्या

  • बेस 64 एन्कोडिंग है बहुत अधिक स्थान की आवश्यकता है। 3 बाइट्स 4 वर्ण (फैक्टर 8/3)
  • में बदलने का आप पूरी फ़ाइल एक बार में पढ़

उसी तरह से अपना पहला दृष्टिकोण इस मुद्दों को हल किया। तो बस उस संस्करण

का उपयोग इस तरह से, तुम क्यों decodeByteArray उपयोग कर रहे हैं के द्वारा और न decodeFile

+0

मैं डीकोड बाइट सरणी का उपयोग कर रहा हूं क्योंकि जब मैं चित्र को एन्कोड करता हूं, तो मैं इसे एक फ़ाइल में नहीं डालता, मैं इसे एक स्थिर चर में संग्रहीत करता हूं, और फिर मेरे अगले सक्रियता – jcw

+0

से एक्सेस करता है क्या डीकोड फ़ाइल अधिक कुशल है? – jcw

+0

किसी भी तरह से, ठोस कार्यान्वयन पर निर्भर करता है। decodeFile को एक (विशाल) बाइट सरणी की आवश्यकता नहीं है, यह संभव है कि मूल (सी ++?) कार्यान्वयन बहुत अधिक मेमोरी प्रभावशाली है –

1

तुम एक अस्थायी फ़ाइल को डिकोड और उस फ़ाइल से छवि बनाने के लिए कोशिश कर सकते हैं।

बेस 64 के रूप में, यह प्रति चरित्र 6 बिट्स, या 6x4 = 24 बिट्स = 3 बाइट प्रति 4 वर्ण हैं। तो यदि आप बेस 64 के 4 अक्षर लेते हैं, तो आप संबंधित 3 बाइट्स को तोड़ नहीं देंगे। यही है, आप बेस इंडेक्स-एन्कोडेड डेटा को चरित्र इंडेक्स पर विभाजित कर सकते हैं जो कि 4 से अधिक हैं।

+0

एक अस्थायी फ़ाइल बनाना जैसे यह काम कर सकता है, मैं इसे एक शॉट दूंगा – jcw

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