Jak przekonwertować ciąg Base64 na obraz bitmapowy, aby pokazać go w ImageView?


187

Mam ciąg Base64, który reprezentuje obraz BitMap.

Muszę ponownie przekształcić ten ciąg w obraz BitMap, aby użyć go w ImageView w mojej aplikacji na Androida

Jak to zrobić?

Oto kod, którego używam do przekształcenia 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);

Odpowiedzi:


350

Możesz po prostu przywrócić kod za pomocą innych wbudowanych metod.

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

23
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); byte [] decodedString = Base64.decode (photoData.getBytes (), Base64.DEFAULT); Mam nadzieję, że to komuś pomoże.
srinivasan

byte [] b = Base64.decode (wcześniejEncodedImage.getBytes (), Base64.DEFAULT); bitmap = BitmapFactory.decodeByteArray (b, 0, b. długość); bitmapa zwraca null w moim przypadku. jak przekonwertować ciąg 64-bitowy na bitmapę?
Rajesh,

jak już odpowiedziano Jeśli ciąg zakodowanego obrazu jest odpowiedzią JSON, po prostu użyj Base64.URL_SAFE zamiast Base64.DEAULT
Chinmoy

7
Aby usunąć dane: zdjęcie ... zarówno PNG i JPEG spróbuj tego:String cleanImage = base64Image.replace("data:image/png;base64,", "").replace("data:image/jpeg;base64,","");
Luis Cabrera Benito

Wspaniała praca jak urok ... +1
Vasudev Vyas

65

Każdemu, kto nadal jest zainteresowany tym pytaniem: Jeśli: 1-decodeByteArray zwraca null 2-Base64.decode zgłasza wyjątek bad-base64

Oto rozwiązanie: - Powinieneś wziąć pod uwagę, że wartość wysyłana do ciebie z API jest zakodowana w Base64 i najpierw należy ją zdekodować, aby rzutować ją na obiekt Bitmap! -Spójrz na swój napis zakodowany w Base64, jeśli zaczyna się od

dane: obraz / jpg; base64

Kod Base64.decode nie będzie mógł go zdekodować, więc należy go usunąć z zakodowanego ciągu:

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

Teraz obiekt pureBase64Encoded jest gotowy do zdekodowania:

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

Teraz po prostu użyj poniższej linii, aby przekształcić to w obiekt bitmapowy ! :

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

Lub jeśli korzystasz ze wspaniałej biblioteki Glide :

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

To powinno wystarczyć! Zmarnowało to jeden dzień i wymyśliło to rozwiązanie!

Uwaga : jeśli nadal pojawia się błąd złej base64, rozważ inne flagi Base64.decode, takie jak Base64.URL_SAFE i tak dalej


Dostałem base64 z odpowiedzi JSON, użyłem Base.64.URL_SAFE dostałem zły błąd base64, sprawdziłem ten wątek i rozwiązałem, Kciuki w górę człowiek ..
Livemaker

17

To jest bardzo stary wątek, ale postanowiłem podzielić się tą odpowiedzią, ponieważ zajęło mi dużo czasu na opracowanie NULLzwrotów w BitmapFactory.decodeByteArray()obliczu @Anirudh.

Jeśli encodedImageciąg jest JSONodpowiedzią, po prostu użyj Base64.URL_SAFEzamiastBase64.DEAULT

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

1
Otrzymuję błąd bad-base64 (IllegalArgumentException) podczas korzystania z Base64.URL_SAFE. Sprawdziłem ciąg base64 za pomocą tagu HTML img. Widzę obraz na stronie HTML.
mudit

Cześć @mudit, czy wymyśliłeś, jak naprawić wyjątek bad-base64? Jeśli tak, czy chcesz się tym podzielić? Mam ten sam problem. Były już dwa dni i brakuje pomysłów.
ito

@ito 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); byte [] decodedString = Base64.decode (photoData.getBytes (), Base64.DEFAULT);
srinivasan

Ja też dużo walczyłem o to jedno słowo „Base64.URL_SAFE” ..... ściągałem jako json obj ... Dzięki tona
Chinmoy

11

Aby sprawdzić online, możesz użyć

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

W ten sposób możesz przekonwertować ciąg na obraz

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//roidroid-convert-image-base64-string-base64-string-image.html


2
Okazało się, że witryna jest bardzo przydatna w ustalaniu, czy wystąpił problem z moim kodem lub danymi obrazu. Dzięki za udostępnienie!
Mark O'Sullivan

2

Znalazłem to łatwe rozwiązanie

Aby przekonwertować mapę bitową na Base64, użyj tej metody.

private String convertBitmapToBase64(Bitmap bitmap) {
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
    byte[] byteArray = byteArrayOutputStream .toByteArray();
    return Base64.encodeToString(byteArray, Base64.DEFAULT);
}

Aby przekonwertować z Base64 na bitmapę LUB przywrócić.

private Bitmap convertBase64ToBitmap(String b64) {
    byte[] imageAsBytes = Base64.decode(b64.getBytes(), Base64.DEFAULT);
    return BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length);
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.