2012-02-10 32 views
74

Làm thế nào để chuyển đổi một Bitmap lớn (ảnh được chụp bằng camera của điện thoại) thành một chuỗi Base64?Android Bitmap to Base64 String

+0

Làm thế nào để bạn muốn mã hóa hình ảnh? –

Trả lời

195

sử dụng phương pháp sau đây để chuyển đổi định dạng bitmap lên mảng byte:

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream); 
byte[] byteArray = byteArrayOutputStream .toByteArray(); 

để mã hóa base64 từ byte sử dụng mảng phương pháp sau đây

String encoded = Base64.encodeToString(byteArray, Base64.DEFAULT); 
+0

Cảm ơn vì giải pháp, tôi đã sử dụng cùng một mã nhưng chuỗi mã hóa của tôi có ... cuối cùng và tôi nghĩ rằng nó không được chuyển đổi hoàn toàn vì vậy hãy cho tôi biết lý do tại sao Base 64 string là các dấu chấm (...) .. –

+1

@ Nhờ mọi người tôi đã giải quyết vấn đề –

+0

@Pankaj Hi u có thể cho tôi biết làm thế nào u giải quyết vấn đề đó, im phải đối mặt với cùng một vấn đề trong chuỗi mã hóa của tôi có 3 dấu chấm (.. .) bạn có thể vui lòng giúp giải quyết rằng –

1

Sử dụng getPixels để lấy Bitmap dưới dạng mảng byte. Sau đó, bạn có thể sử dụng Base64.encodeToString để thực hiện việc mã hóa. Điều này sẽ chỉ hoạt động đối với API cấp 8 trở lên. Xem câu hỏi this cho các thiết bị cũ hơn.

+0

@ kgiannakakis Cảm ơn bạn đã giúp đỡ nhưng tôi có vấn đề mà cơ sở của tôi 64 mã hóa String có một số ...kết thúc. vì vậy tôi không thể hiểu vấn đề là gì. –

+0

getPixels return int [] vì vậy câu trả lời bên dưới trông giống như cách tiếp cận tốt hơn –

10

Vấn đề với câu trả lời Jeet được rằng bạn nạp tất cả các byte của hình ảnh thành một mảng byte, có khả năng sẽ làm hỏng ứng dụng trong các thiết bị cấp thấp. Thay vào đó, trước tiên tôi sẽ viết hình ảnh vào một tệp và đọc nó bằng cách sử dụng lớp Base64InputStream của Apache. Sau đó, bạn có thể tạo chuỗi Base64 trực tiếp từ InputStream của tệp đó. Nó sẽ giống như thế này:

//Don't forget the manifest permission to write files 
final FileOutputStream fos = new FileOutputStream(yourFileHere); 
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); 

fos.close(); 

final InputStream is = new Base64InputStream(new FileInputStream(yourFileHere)); 

//Now that we have the InputStream, we can read it and put it into the String 
final StringWriter writer = new StringWriter(); 
IOUtils.copy(is , writer, encoding); 
final String yourBase64String = writer.toString(); 

Như bạn có thể thấy, các giải pháp trên làm việc trực tiếp với những con suối thay vào đó, tránh sự cần thiết để tải tất cả các byte vào một biến, do đó làm cho bộ nhớ thấp hơn nhiều và ít có khả năng sự cố trong thiết bị cấp thấp. Vẫn còn vấn đề là việc đặt chuỗi Base64 chính nó vào một biến String không phải là một ý tưởng tốt, bởi vì, một lần nữa, nó có thể gây ra lỗi OutOfMemory. Nhưng ít nhất chúng tôi đã giảm mức tiêu thụ bộ nhớ xuống một nửa bằng cách loại bỏ mảng byte.

Nếu bạn muốn bỏ qua bước ghi vào tệp, bạn phải chuyển OutputStream thành InputStream, điều này không đơn giản (bạn phải sử dụng PipedInputStream nhưng phức tạp hơn một chút) hai luồng phải luôn nằm trong các luồng khác nhau).

+2

Mã hóa ở đây là gì? –

8

Tôi có giải pháp nhanh. Chỉ cần tạo một file ImageUtil.java

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.util.Base64; 
import java.io.ByteArrayOutputStream; 

public class ImageUtil 
{ 
    public static Bitmap convert(String base64Str) throws IllegalArgumentException 
    { 
     byte[] decodedBytes = Base64.decode(
      base64Str.substring(base64Str.indexOf(",") + 1), 
      Base64.DEFAULT 
     ); 

     return BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.length); 
    } 

    public static String convert(Bitmap bitmap) 
    { 
     ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
     bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream); 

     return Base64.encodeToString(outputStream.toByteArray(), Base64.DEFAULT); 
    } 

} 

Cách sử dụng:

Bitmap bitmap = ImageUtil.convert(base64String); 

hoặc

String base64String = ImageUtil.convert(bitmap); 
1

Hãy thử điều này, đầu tiên mở rộng hình ảnh của bạn với chiều rộng cần thiết và chiều cao, chỉ cần vượt qua bitmap ban đầu của bạn, yêu cầu chiều rộng và chiều cao yêu cầu theo phương pháp sau và nhận bitmap thu nhỏ lại:

Ví dụ: Bitmap scaledBitmap = getScaledBitmap (originalBitmap, 250, 350);

private Bitmap getScaledBitmap(Bitmap b, int reqWidth, int reqHeight) 
{ 
    int bWidth = b.getWidth(); 
    int bHeight = b.getHeight(); 

    int nWidth = bWidth; 
    int nHeight = bHeight; 

    if(nWidth > reqWidth) 
    { 
     int ratio = bWidth/reqWidth; 
     if(ratio > 0) 
     { 
      nWidth = reqWidth; 
      nHeight = bHeight/ratio; 
     } 
    } 

    if(nHeight > reqHeight) 
    { 
     int ratio = bHeight/reqHeight; 
     if(ratio > 0) 
     { 
      nHeight = reqHeight; 
      nWidth = bWidth/ratio; 
     } 
    } 

    return Bitmap.createScaledBitmap(b, nWidth, nHeight, true); 
} 

Bây giờ chỉ cần vượt qua bitmap quy mô của mình vào phương pháp sau đây và nhận được chuỗi base64 lại:

Ví dụ: String base64String = getBase64String (scaledBitmap);

private String getBase64String(Bitmap bitmap) 
{ 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); 

    byte[] imageBytes = baos.toByteArray(); 

    String base64String = Base64.encodeToString(imageBytes, Base64.NO_WRAP); 

    return base64String; 
} 

Để giải mã các chuỗi base64 trở lại hình ảnh bitmap:

byte[] decodedByteArray = Base64.decode(base64String, Base64.NO_WRAP); 
Bitmap decodedBitmap = BitmapFactory.decodeByteArray(decodedByteArray, 0, decodedString.length);