วิธีการแปลงสตริง Base64 เป็นอิมเมจบิตแมปเพื่อแสดงใน ImageView


187

ฉันมี Base64 String ที่แทนภาพ BitMap

ฉันต้องแปลงสตริงนั้นให้เป็นรูปภาพ BitMap อีกครั้งเพื่อใช้กับ ImageView ในแอพ Android ของฉัน

ทำอย่างไร?

นี่คือรหัสที่ฉันใช้ในการแปลงภาพเป็น base64 String:

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

คำตอบ:


350

คุณสามารถย้อนกลับโค้ดของคุณได้โดยใช้วิธีอื่น ๆ

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

23
ตรวจสอบให้แน่ใจว่าคุณไม่ได้ผ่าน "data: image / jpg; base64" และส่งเฉพาะไบต์ภาพเท่านั้น .. อย่าลืมเปลี่ยนสตริงเป็นไบต์ .. photoData = photoData.substring (photoData.indexOf (",") + 1); ไบต์ [] decodedString = Base64.decode (photoData.getBytes (), Base64.DEFAULT); หวังว่ามันจะช่วยให้ใครบางคน
srinivasan

ไบต์ [] b = Base64.decode (previousEncodedImage.getBytes (), Base64.DEFAULT); bitmap = BitmapFactory.decodeByteArray (b, 0, b.length); บิตแมปส่งคืน null ในเคสของฉันวิธีแปลงสตริงเบส 64 เป็นบิตแมป
Rajesh

ตามที่ได้รับคำตอบแล้วหากสตริง encodedImage เป็นการตอบสนอง JSON เพียงใช้ Base64.URL_SAFE แทน Base64.DEAULT
Chinmoy

7
หากต้องการลบข้อมูล: รูปภาพ ... สำหรับทั้ง png และ jpeg ลองนี้:String cleanImage = base64Image.replace("data:image/png;base64,", "").replace("data:image/jpeg;base64,","");
Luis Cabrera Benito

ผลงานยอดเยี่ยม Like Charm ... +1
Vasudev Vyas

65

ถึงใครก็ตามที่ยังสนใจในคำถามนี้: ถ้า: 1-decodeByteArray ส่งคืน null 2-Base64.decode พ่น bad-base64 Exception

นี่คือทางออก: - คุณควรพิจารณาค่าที่ส่งถึงคุณจาก API คือ Base64 Encoded และควรถอดรหัสก่อนเพื่อส่งไปยังวัตถุ Bitmap! ลองดูที่สตริงการเข้ารหัส Base64 ของคุณหากเริ่มต้นด้วย

ข้อมูล: image / JPG; base64

Base64.decode จะไม่สามารถถอดรหัสได้ดังนั้นจึงต้องถูกลบออกจากสตริงที่เข้ารหัสของคุณ:

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

ตอนนี้pureBase64Encodedอ็อบเจ็กต์พร้อมที่จะถอดรหัส:

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

ตอนนี้เพียงแค่ใช้บรรทัดด้านล่างเพื่อเปลี่ยนเป็น วัตถุบิตแมป ! :

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

หรือถ้าคุณกำลังใช้ไลบรารี่ที่ยอดเยี่ยม:

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

นี่ควรจะทำงาน! มันเสียไปหนึ่งวันแล้วก็มาถึงวิธีนี้!

หมายเหตุ : หากคุณยังคงได้รับข้อผิดพลาด bad-base64 ให้พิจารณาการตั้งค่าสถานะอื่น ๆ ของ Base64.decode เช่น Base64.URL_SAFE และอื่น ๆ


ฉันได้รับ base64 จากการตอบสนอง json ใช้ Base.64.URL_SAFE มีข้อผิดพลาด base64 ตรวจสอบหัวข้อนี้และแก้ไข Thumbs up man ..
livemaker

17

นี่เป็นเธรดเก่ามาก แต่คิดว่าจะแบ่งปันคำตอบนี้เนื่องจากใช้เวลาในการพัฒนาจำนวนมากในการจัดการNULLผลตอบแทนของBitmapFactory.decodeByteArray()@Anirudh ที่ต้องเผชิญ

หากencodedImageสตริงเป็นการJSONตอบสนองให้ใช้Base64.URL_SAFEแทนBase64.DEAULT

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

1
ฉันได้รับข้อผิดพลาด base64 (IllegalArgumentException) ที่ไม่ถูกต้องเมื่อใช้ Base64.URL_SAFE ฉันยืนยันสตริง base64 โดยใช้แท็ก HTML img ฉันเห็นภาพในหน้า HTML
mudit

สวัสดี @mudit คุณคิดวิธีแก้ไขข้อยกเว้น bad-base64 หรือไม่? ถ้าเป็นเช่นนั้นคุณต้องการแบ่งปันหรือไม่ ฉันมีปัญหาเดียวกัน เป็นเวลาสองวันแล้วและไอเดียก็หมดไป
ito

@ito ตรวจสอบให้แน่ใจว่าคุณไม่ผ่าน "data: image / jpg; base64" และส่งเฉพาะไบต์ภาพเท่านั้น .. อย่าลืมเปลี่ยนสตริงเป็นไบต์ .. photoData = photoData.substring (photoData.indexOf (", ") + 1); ไบต์ [] decodedString = Base64.decode (photoData.getBytes (), Base64.DEFAULT);
srinivasan

ฉันพยายามมากเกินไปสำหรับคำเดียวนี้ "Base64.URL_SAFE" ..... ฉันถูกเรียกเป็น json obj ... ขอบคุณหนึ่งตัน
Chinmoy

11

ในการตรวจสอบออนไลน์คุณสามารถใช้

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

คุณสามารถแปลงสตริงเป็นภาพได้ด้วยวิธีนี้

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


2
พบว่าเว็บไซต์มีประโยชน์มากสำหรับการค้นหาว่ามีปัญหากับรหัสของฉันหรือกับข้อมูลภาพ ขอบคุณสำหรับการแบ่งปัน!
Mark O'Sullivan

2

ฉันพบโซลูชันที่ง่ายนี้แล้ว

ในการแปลงจากบิตแมปเป็น Base64 ให้ใช้วิธีนี้

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

ในการแปลงจาก Base64 เป็น bitmap หรือแปลงกลับ

private Bitmap convertBase64ToBitmap(String b64) {
    byte[] imageAsBytes = Base64.decode(b64.getBytes(), Base64.DEFAULT);
    return BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.