Làm cách nào để chuyển đổi chuỗi Base64 thành hình ảnh Bitmap để hiển thị chuỗi đó trong ImageView?


186

Tôi có Chuỗi Base64 đại diện cho hình ảnh BitMap.

Tôi cần phải chuyển đổi Chuỗi đó thành hình ảnh BitMap một lần nữa để sử dụng nó trên ImageView trong ứng dụng Android của tôi

Làm thế nào để làm nó?

Đây là mã mà tôi sử dụng để chuyển đổi hình ảnh thành Chuỗi cơ sở64:

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

Câu trả lời:


349

Về cơ bản, bạn có thể hoàn nguyên mã của mình bằng một số phương thức tích hợp khác.

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

22
đảm bảo bạn không truyền "data: image / jpg; base64" và chỉ truyền các byte hình ảnh .. Đừng quên thay đổi chuỗi thành byte .. photoData = photoData.subopes (photoData.indexOf (",") + 1); byte [] decodingString = Base64.decode (photoData.getBytes (), Base64.DEFAULT); Hy vọng nó sẽ giúp cho một ai đó.
srinivasan

byte [] b = Base64.decode (trướcEncodingImage.getBytes (), Base64.DEFAULT); bitmap = BitmapFactory.decodeByteArray (b, 0, b.length); bitmap trả về null trong trường hợp của tôi. Làm thế nào để chuyển đổi chuỗi cơ sở 64 thành bitmap?
Rajesh

như đã trả lời Nếu chuỗi được mã hóa là phản hồi JSON, chỉ cần sử dụng Base64.URL_SAFE thay vì Base64.DEAULT
Chinmoy

6
Để xóa dữ liệu: hình ảnh ... cho cả png và jpeg, hãy thử điều này:String cleanImage = base64Image.replace("data:image/png;base64,", "").replace("data:image/jpeg;base64,","");
Luis Cabrera Benito

Công việc tuyệt vời như sự quyến rũ ... +1
Vasudev Vyas

65

Cho bất cứ ai vẫn quan tâm đến câu hỏi này: Nếu: 1-decodeByteArray trả về null 2-Base64.decode ném ngoại lệ xấu-base64

Đây là giải pháp: -Bạn nên xem giá trị được gửi cho bạn từ API là Mã hóa Base64 và nên được giải mã trước để chuyển nó thành đối tượng Bitmap! Hãy nhìn vào Chuỗi được mã hóa Base64 của bạn, Nếu nó bắt đầu bằng

dữ liệu: hình ảnh / jpg; cơ sở64

Base64.decode sẽ không thể giải mã nó, vì vậy nó phải bị xóa khỏi Chuỗi được mã hóa của bạn:

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

Bây giờ, đối tượng PureBase64Encoding đã sẵn sàng để được giải mã:

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

Bây giờ chỉ cần sử dụng dòng bên dưới để biến điều này thành Đối tượng Bitmap ! :

Bitmap decodingBitmap = BitmapFactory.decodeByteArray (decodingBytes, 0, decodingBytes.length);

Hoặc nếu bạn đang sử dụng thư viện tuyệt vời Glide :

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

Điều này nên làm công việc! Nó lãng phí một ngày về điều này và đưa ra giải pháp này!

Lưu ý : Nếu bạn vẫn gặp lỗi bad-base64, hãy xem xét các cờ Base64.decode khác như Base64.URL_SAFE, v.v.


Tôi đã nhận được Base64 từ phản hồi json, đã sử dụng Base.64.URL_SAFE gặp lỗi bad-base64, Đã kiểm tra chủ đề này và giải quyết, Thumbs up man ..
trực tiếp vào

17

Đây là một chủ đề rất cũ nhưng được cho là để chia sẻ câu trả lời này vì tôi mất rất nhiều thời gian phát triển để quản lý sự NULLtrở lại BitmapFactory.decodeByteArray()như @Anirudh đã phải đối mặt.

Nếu encodedImagechuỗi là một JSONphản hồi, chỉ cần sử dụng Base64.URL_SAFEthay vìBase64.DEAULT

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

1
tôi đang gặp lỗi bad-base64 (IllegalArgumentException) khi sử dụng Base64.URL_SAFE. Tôi đã xác minh chuỗi base64 bằng thẻ img img. Tôi đang nhìn thấy hình ảnh trên trang HTML.
Mudit

Xin chào @mudit, bạn đã tìm ra cách khắc phục ngoại lệ xấu-base64 chưa? Nếu vậy bạn có phiền để chia sẻ? Tôi gặp vấn đề tương tự. Đã được hai ngày nay và hết ý tưởng.
ito

@ito đảm bảo bạn không truyền "data: image / jpg; base64" và chỉ truyền các byte hình ảnh .. Đừng quên thay đổi chuỗi thành byte .. photoData = photoData.subopes (photoData.indexOf (", ") + 1); byte [] decodingString = Base64.decode (photoData.getBytes (), Base64.DEFAULT);
srinivasan

Tôi cũng đã đấu tranh rất nhiều cho từ này "Base64.URL_SAFE" ..... Tôi đã tìm nạp như json obj ... Cảm ơn rất nhiều
Chinmoy

11

Để kiểm tra trực tuyến, bạn có thể sử dụng

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

Bạn có thể chuyển đổi chuỗi thành hình ảnh như thế này

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-opes-base64-opes-image.html


2
Tìm thấy trang web rất hữu ích để tìm ra nếu có vấn đề với mã của tôi hoặc với dữ liệu hình ảnh. Cám ơn vì đã chia sẻ!
Đánh dấu O'Sullivan

2

Tôi đã tìm thấy giải pháp dễ dàng này

Để chuyển đổi từ bitmap sang Base64, hãy sử dụng phương pháp này.

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

Để chuyển đổi từ Base64 sang bitmap HOẶC hoàn nguyên.

private Bitmap convertBase64ToBitmap(String b64) {
    byte[] imageAsBytes = Base64.decode(b64.getBytes(), Base64.DEFAULT);
    return BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.