2013-07-06 17 views
18

मेरे पास एक JSON स्ट्रिंग के माध्यम से मुझे एक छवि भेजी जा रही है। मैं उस स्ट्रिंग को अपने एंड्रॉइड ऐप में एक छवि में कनवर्ट करना चाहता हूं और फिर उस छवि को प्रदर्शित करना चाहता हूं।जावा में छवि को बेस 64 स्ट्रिंग में कनवर्ट करें

JSON स्ट्रिंग इस तरह दिखता है:

"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVI..." 

नोट: मैं एक साथ स्ट्रिंग छोटा कर दिया ...

मैं एक समारोह है कि (मुझे लगता है कि) एक छवि में स्ट्रिंग धर्मान्तरित मिल गया है । क्या मैं इसे ठीक से कर रहा हूं?

public Bitmap ConvertToImage(String image){ 
    try{ 
     InputStream stream = new ByteArrayInputStream(image.getBytes()); 
     Bitmap bitmap = BitmapFactory.decodeStream(stream);     
     return bitmap; 
    } 
    catch (Exception e) { 
     return null;    
    } 
} 

तब मैं इस

String image = jsonObject.getString("barcode_img");   
Bitmap myBitmap = this.ConvertToImage(image); 
ImageView cimg = (ImageView)findViewById(R.id.imageView1); 

//Now try setting dynamic image 
cimg.setImageBitmap(myBitmap); 

हालांकि तरह मेरे एंड्रॉयड गतिविधि पर प्रदर्शित करने के लिए प्रयास करें, जब मैं ऐसा करते हैं, कुछ भी नहीं दिखाई देता है। मुझे लॉगकैट में कोई त्रुटि नहीं है। मैं क्या गलत कर रहा हूं?

धन्यवाद

उत्तर

43

मैं के बारे में चिंतित है कि आप केवल base64 स्ट्रिंग डिकोड करने के लिए छवि बाइट्स प्राप्त करने के लिए है, तो आपके

"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVI..." 

स्ट्रिंग में, आप data:image\/png;base64, के बाद डेटा प्राप्त करना होगा की जरूरत है हूँ, इसलिए आप केवल छवि प्राप्त बाइट्स और फिर उन्हें डिकोड:

String imageDataBytes = completeImageData.substring(completeImageData.indexOf(",")+1); 

InputStream stream = new ByteArrayInputStream(Base64.decode(imageDataBytes.getBytes(), Base64.DEFAULT)); 

यह एक कोड ताकि आप समझ सकें कि यह कैसे काम करता है, लेकिन अगर आप एक JSON ऑब्जेक्ट प्राप्त यह सही तरह से किया जाना चाहिए:

  • JSON स्ट्रिंग को JSON ऑब्जेक्ट में कनवर्ट करना।
  • data कुंजी के तहत स्ट्रिंग निकालें।
  • सुनिश्चित करें कि image/png से शुरू होता है ताकि आपको पता हो कि एक पीएनजी छवि है।
  • सुनिश्चित करें कि base64 स्ट्रिंग है, इसलिए आप जानते हैं कि डेटा को डीकोड किया जाना चाहिए।
  • छवि प्राप्त करने के लिए base64 स्ट्रिंग के बाद डेटा को डीकोड करें।
+0

आप चट्टान! "," के सूचकांक में सबस्ट्रिंग के लिए भी धन्यवाद ... वह हिस्सा अनिवार्य था। – user952342

+0

आपका स्वागत है;) –

+0

सही ... यह मेरे लिए काम किया .. –

3
InputStream stream = new ByteArrayInputStream(image.getBytes()); 

InputStream stream = new ByteArrayInputStream(Base64.decode(image.getBytes(), Base64.DEFAULT)); 

को बदला जाना चाहिए कैसे Base64 डिकोडिंग करने के बारे में जानकारी के लिए देखें http://developer.android.com/reference/android/util/Base64.html

अस्वीकरण: मैंने वाक्यविन्यास के लिए जांच नहीं की है, लेकिन इस तरह आपको इसे करना चाहिए।

+1

'छवि \/png; base64, 'डीकोड नहीं किया जाना चाहिए। –

+1

@ जॉर्ज, डाउनवॉटिंग के बजाय, आप मेरा जवाब संपादित कर सकते थे। प्वाइंट यह है कि लेखक 64 64 डीकोडिंग करने के लिए गायब था। –

+0

धन्यवाद वंड निर्माता! आपका समाधान आधा सही था ... लेकिन मुझे "," के बाद भी एक सबस्ट्रिंग लेने की आवश्यकता थी। – user952342

1

यहां काम करने वाला कोड है जो बेस 64 एन्कोडेड इनपुटस्ट्रीम को परिवर्तित करता है और इसे डिस्क पर लिखता है। मैंने इसे सही तरीके से काम करने के लिए कुछ समय बिताया। तो मुझे आशा है कि यह अन्य डेवलपर्स की मदद करेगा।

public boolean writeImageToDisk(FileItem item, File imageFile) { 
    // clear error message 
    errorMessage = null; 
    FileOutputStream out = null; 
    boolean ret = false; 
    try { 
     // write thumbnail to output folder 
     out = createOutputStream(imageFile); 

     // Copy input stream to output stream 
     byte[] headerBytes = new byte[22]; 
     InputStream imageStream = item.getInputStream(); 
     imageStream.read(headerBytes); 

     String header = new String(headerBytes); 
     // System.out.println(header); 

     byte[] b = new byte[4 * 1024]; 
     byte[] decoded; 
     int read = 0; 
     while ((read = imageStream.read(b)) != -1) { 
      // System.out.println(); 
      if (Base64.isArrayByteBase64(b)) { 
       decoded = Base64.decodeBase64(b); 
       out.write(decoded); 
      } 
     } 

     ret = true; 
    } catch (IOException e) { 
     StringWriter sw = new StringWriter(); 
     e.printStackTrace(new PrintWriter(sw)); 
     errorMessage = "error: " + sw; 

    } finally { 
     if (out != null) { 
      try { 
       out.close(); 
      } catch (Exception e) { 
       StringWriter sw = new StringWriter(); 
       e.printStackTrace(new PrintWriter(sw)); 
       System.out.println("Cannot close outputStream after writing file to disk!" + sw.toString()); 
      } 
     } 

    } 

    return ret; 
} 

/** 
* Helper method for the creation of a file output stream. 
* 
* @param imageFolder 
*   : folder where images are to be saved. 
* @param id 
*   : id of spcefic image file. 
* @return FileOutputStream object prepared to store images. 
* @throws FileNotFoundException 
*/ 
protected FileOutputStream createOutputStream(File imageFile) throws FileNotFoundException { 

    imageFile.getParentFile().mkdirs(); 

    return new FileOutputStream(imageFile); 
} 
संबंधित मुद्दे