2013-07-06 14 views
18

JSON dizesi aracılığıyla bana gönderilen bir görüntü var. Bu dizeyi android uygulamamdaki bir resme dönüştürmek ve daha sonra bu resmi görüntülemek istiyorum.Temel64 dizesini Java'daki Görüntüye dönüştürün

JSON dizesi şöyle görünür:

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

Not: Bir ile dize kesilmiş ...

ben bir görüntü içine dize dönüştürür (Bence) bir işlevi var . Bunu doğru mu yapıyorum?

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

Sonra bunu yaparken, hiçbir şey gösterir, ancak bu

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); 

gibi benim android aktivitesi üzerine görüntülemek için deneyin. Logcat'ta hiç hata görmüyorum. Neyi yanlış yapıyorum?

Teşekkür

cevap

43

Ben sen, sen data:image\/png;base64, sonra verileri almak gerekir sizin

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

dizede böylece, görüntü bayt almak için tek base64 dize deşifre gerektiğini endişeleniyorum, bu yüzden sadece görüntü elde nasıl çalıştığını anlamaları için bu bir koddur

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

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

, ancak bir JSON nesnesi alırsanız o doğru şekilde yapılmalıdır:: bayt ve sonra bunları çözmek

  • JSON dizgisini bir JSON nesnesine dönüştürme.
  • Dize data anahtarının altında ayıklayın.
  • image/png ile başladığınızdan emin olun, böylece bir png görüntüsüdür.
  • base64 dizesinin içerdiğinden emin olun, böylece verilerin deşifre edilmesi gerektiğini biliyorsunuz.
  • Görüntüyü elde etmek için base64 dizesinden sonra verileri çözün.
+0

size rock! "," dizinindeki alt dizeler için teşekkürler ... o bölüm zorunluydu. – user952342

+0

Rica ederim;) –

+0

Doğru ... bu benim için çalıştı .. –

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

Base64 çözme nasıl yapılacağına ilişkin ayrıntılar için http://developer.android.com/reference/android/util/Base64.html bakın

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

şekilde değiştirilmelidir.

Yasal Uyarı: Sözdizimini kontrol etmedim, ancak bunu yapmanız gerekir.

+1

'görüntü \/PNG; base64,' kodu çözülecek olan yok. –

+1

@Jorge, Aşağı çekmek yerine cevabımı düzenleyebilirdiniz. Nokta, yazarın 64 kod çözme işlemini gerçekleştirmesi için eksik olduğu. –

+0

Teşekkürler Wand Maker! Çözümün yarısı haklıydı ... ama "," den sonra bir alt yazı almam gerekiyordu. – user952342

1

Base64 kodlu inputStream öğesini dönüştüren ve diske yazan çalışma kodu İşte. Doğru çalışması için birkaç kez harcadım. Umarım bu, diğer geliştiricilere yardımcı olur.

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); 
} 
İlgili konular