2011-01-29 72 views
135

Tôi có một chuỗi Base64 đại diện cho một hình ảnh Bitmap.Làm thế nào để chuyển đổi một chuỗi Base64 thành một hình ảnh Bitmap để hiển thị nó trong một ImageView?

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

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

Đây là mã mà tôi sử dụng để chuyển đổi hình ảnh vào chuỗi 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); 

Trả lời

256

Bạn có thể chỉ về cơ bản trở lại mã của bạn sử dụng một số khác được xây dựng trong phương pháp.

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

decodedByte trả về null trong trường hợp của tôi – Anirudh

+1

@Anirudh: nó có hiệu quả với bạn không? – mudit

+11

đảm bảo rằng bạn không chuyển "dữ liệu: hình ảnh/jpg; base64" và chỉ vượt qua các byte hình ảnh .. Đừng quên thay đổi chuỗi thành byte .. photoData = photoData.substring (photoData.indexOf (", ") + 1); byte [] decodedString = Base64.decode (photoData.getBytes(), Base64.DEFAULT); Hy vọng nó sẽ giúp cho ai đó. – srinivasan

14

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

Nếu chuỗi encodedImage là một phản ứng JSON, chỉ cần sử dụng Base64.URL_SAFE thay vì Base64.DEAULT

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

tôi đang nhận được một bad-base64 (IllegalArgumentException) lỗi khi sử dụng Base64.URL_SAFE. Tôi đã xác minh chuỗi base64 bằng thẻ img HTML. Tôi thấy hình ảnh trên trang HTML. – mudit

+0

Xin chào @mudit, bạn đã tìm ra cách sửa lỗi ngoại lệ bad-base64 chưa? Nếu bạn có ý định chia sẻ? Tôi gặp vấn đề tương tự. Đã được hai ngày nay và hết ý tưởng. – ito

+0

@ito đảm bảo bạn không chuyển "dữ liệu: hình ảnh/jpg; base64" và chỉ vượt qua các byte hình ảnh .. Đừng quên thay đổi chuỗi thành byte .. photoData = photoData.substring (photoData.indexOf (",") + 1); byte [] decodedString = Base64.decode (photoData.getBytes(), Base64.DEFAULT); – srinivasan

34

Đối với những ai vẫn còn quan tâm đến câu hỏi này: Nếu: 1-decodeByteArray trả về null 2 Base64. giải mã ném bad-base64 Exception

Đây là giải pháp: -Bạn nên xem xét giá trị được gửi cho bạn từ API là Base64 được mã hóa và phải được giải mã đầu tiên trong hoặc der để đúc nó vào một đối tượng Bitmap! -Tham xem Base64 mã hóa chuỗi của bạn, Nếu nó bắt đầu với

dữ liệu: image/jpg; base64

Các Base64.decode sẽ không thể giải mã nó, Vì vậy, nó có phải được loại bỏ từ chuỗi 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ờ pureBase64Encoded đối tượng đã 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 một đối tượng Bitmap! :

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

Hoặc nếu bạn đang sử dụng các thư viện lớn Glide:

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

này nên thực hiện 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 cơ bản thì hãy xem xét các cờ Base64.decode khác như Base64.URL_SAFE và vân vân

+0

Tôi nhận base64 từ phản hồi json, được sử dụng Base.64.URL_SAFE có bad-base64 lỗi, Kiểm tra chủ đề này và giải quyết, Thumbs up man .. – livemaker

4

Để 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 hình ảnh như cách 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-string-base64-string-image.html

+0

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

Các vấn đề liên quan