2011-01-29 9 views
135

Mam ciąg Base64, który reprezentuje obraz BitMap.Jak przekonwertować ciąg Base64 na obraz BitMap, aby pokazać go w ImageView?

muszę przekształcić ten ciąg do bitmapy ponownie użyć go na ImageView w moim Android app

Jak to zrobić?

Jest to kod, który używam do przekształcania obrazu w ciąg base64:

//proceso de transformar la imagen BitMap en un String: 
//android:src="c:\logo.png" 
Resources r = this.getResources(); 
Bitmap bm = BitmapFactory.decodeResource(r, R.drawable.logo); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
bm.compress(Bitmap.CompressFormat.PNG, 100, baos); //bm is the bitmap object 
byte[] b = baos.toByteArray(); 
//String encodedImage = Base64.encode(b, Base64.DEFAULT); 
encodedImage = Base64.encodeBytes(b); 

Odpowiedz

256

właśnie zasadzie można przywrócić swój kod za pomocą niektórych innych wbudowanych metod.

byte[] decodedString = Base64.decode(encodedImage, Base64.DEFAULT); 
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length); 
+25

decodedByte zwraca NULL w moim przypadku – Anirudh

+1

@Airirh: czy to działa dla ciebie? – mudit

+11

upewnij się, że nie przekazujesz "data: image/jpg; base64" i przekazujesz tylko bajty obrazu. Nie zapomnij zmienić łańcucha na bajty. photoData = photoData.substring (photoData.indexOf (", ") + 1); bajt [] decodedString = Base64.decode (photoData.getBytes(), Base64.DEFAULT); Mam nadzieję, że pomaga komuś. – srinivasan

14

Jest to bardzo stary wątek, ale myślałem, aby udostępnić tę odpowiedź jako zajęło dużo czasu rozwoju zarządzać NULL powrót BitmapFactory.decodeByteArray() jak @Anirudh ma do czynienia.

Jeśli łańcuch encodedImage jest odpowiedzią JSON, wystarczy użyć Base64.URL_SAFE zamiast Base64.DEAULT

byte[] decodedString = Base64.decode(encodedImage, Base64.URL_SAFE); 
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length); 
+0

Otrzymuję błąd bad-base64 (IllegalArgumentException) przy korzystaniu z Base64.URL_SAFE. Zweryfikowałem ciąg base64 za pomocą znacznika HTML img. Widzę obraz na stronie HTML. – mudit

+0

Hi @mudit, czy wiesz, jak naprawić wyjątek bad-base64? Jeśli tak, to czy chcesz się podzielić? Mam ten sam problem. Były już od dwóch dni i brakowało pomysłów. – ito

+0

@ito upewnij się, że nie przekazujesz "data: image/jpg; base64" i przekazujesz tylko bajty obrazu. Nie zapomnij zmienić ciągu na bajty. photoData = photoData.substring (photoData.indexOf (",") + 1); bajt [] decodedString = Base64.decode (photoData.getBytes(), Base64.DEFAULT); – srinivasan

34

Do każdego, kto jeszcze jest zainteresowany w tej kwestii: Jeśli: 1-decodeByteArray zwraca null 2-Base64. dekodowanie zgłasza bad-base64 Wyjątek

Oto rozwiązanie: - Należy wziąć pod uwagę, że wartość przesłana do ciebie z API jest zakodowana w Base64 i powinna być dekodowana jako pierwsza lub der, aby rzucić go na obiekt bitmapowy! -Take spojrzenie na swojej zakodowane Base64 String, Jeżeli zaczyna się

dane: image/jpg; base64

Base64.decode nie będzie w stanie go rozszyfrować, więc ma zostać usunięte z zakodowanym wyrażenie:

final String encodedString = "data:image/jpg;base64, ....";       
final String pureBase64Encoded = encodedString.substring(encodedString.indexOf(",") + 1); 

teraz pureBase64Encoded obiekt jest gotowy do zdekodowania:

final byte[] decodedBytes = Base64.decode(pureBase64Encoded, Base64.DEFAULT); 

Teraz wystarczy użyć poniższej linii, aby zamienić ją w obiekt Bitmap! :

bitmapy decodedBitmap = BitmapFactory.decodeByteArray (decodedBytes, 0 decodedBytes.length);

Lub jeśli używasz wielką bibliotekę Glide:

Glide.with(CaptchaFragment.this).load(decodedBytes).crossFade().fitCenter().into(mCatpchaImageView); 

ten powinien wykonać zadanie! Zmarnował jeden dzień i podszedł do tego rozwiązania!

Uwaga: Jeśli wciąż się błąd bad-base64 rozważyć inne flagi Base64.decode jak Base64.URL_SAFE i tak dalej

+0

Mam base64 z odpowiedzi jsona, użyłem Base.64.URL_SAFE dostałem bad-base64 błąd, Sprawdzono ten wątek i rozwiązano, Kciuki w górę człowiek .. – livemaker

4

Aby sprawdzić w Internecie można użyć

http://codebeautify.org/base64-to-image-converter

można przekonwertować ciąg obrazek jak ten sposób

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Base64; 
import android.widget.ImageView; 

import java.io.ByteArrayOutputStream; 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ImageView image =(ImageView)findViewById(R.id.image); 

     //encode image to base64 string 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.logo); 
     bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
     byte[] imageBytes = baos.toByteArray(); 
     String imageString = Base64.encodeToString(imageBytes, Base64.DEFAULT); 

     //decode base64 string to image 
     imageBytes = Base64.decode(imageString, Base64.DEFAULT); 
     Bitmap decodedImage = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length); 
     image.setImageBitmap(decodedImage); 
    } 
} 

http://www.thecrazyprogrammer.com/2016/10/android-convert-image-base64-string-base64-string-image.html

+0

Znalazłem stronę bardzo przydatną do ustalenia, czy wystąpił problem z moim kodem lub z danymi obrazu. Dzięki za udostępnienie! –