2013-08-01 42 views
12

Tôi đang làm việc trên một ứng dụng mà tôi cần chụp ảnh từ máy ảnh. Sau khi chụp, tôi phải chuyển đổi Bitmap thành Base64. Sau khi chuyển sang Base64, tôi phải gửi String đó tới SERVER. Tôi đang sử dụng bên dưới mã cho nhiệm vụ này:Không thể chuyển đổi Bitmap thành Chuỗi Base64 hoàn hảo trong Android?

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
image.compress(Bitmap.CompressFormat.PNG, 100, baos); 
byte[] b = baos.toByteArray(); 
base64Image = Base64.encodeToString(b,Base64.DEFAULT); 

Vấn đề: Khi tôi chuyển đổi mà Base64 để hình ảnh, tôi nhận được IMAGE không đầy đủ. Kết quả tương tự cũng xảy ra trên máy chủ mà hình ảnh của tôi không được xây dựng lại hoàn hảo từ Base64 String.

Vui lòng đề xuất giải pháp cho tôi. Tôi đã tìm kiếm rất nhiều và nhận được cùng một mã mà tôi đang sử dụng ngay bây giờ.

được sửa đổi: xin vui lòng xem bên dưới hình ảnh không đầy đủ

enter image description here

sử dụng Mã để chụp hình ảnh:

intent = new Intent("android.media.action.IMAGE_CAPTURE"); 
startActivityForResult(intent, TAKE_PHOTO); 
+0

bạn nhận được * HÌNH ẢNH HẤP DẪN * là gì? –

+0

là sự cố xảy ra đối với tất cả hình ảnh hoặc trên một số hình ảnh cụ thể? –

+0

Từ chuỗi base64, chỉ có 25% hình ảnh được tạo ... và điều này đang xảy ra với tất cả hình ảnh –

Trả lời

3

Tạo lớp Base64 của riêng bạn và sử dụng này:

public class Base64 
{ 

    private Base64() 
    { 
    super(); 
    } 

    /** 
    * Encode some data and return a String. 
    */ 
    public final static String encode(byte[] d) 
    { 
    if (d == null) return null; 
    byte data[] = new byte[d.length+2]; 
    System.arraycopy(d, 0, data, 0, d.length); 
    byte dest[] = new byte[(data.length/3)*4]; 

    // 3-byte to 4-byte conversion 
    for (int sidx = 0, didx=0; sidx < d.length; sidx += 3, didx += 4) 
    { 
     dest[didx] = (byte) ((data[sidx] >>> 2) & 077); 
     dest[didx+1] = (byte) ((data[sidx+1] >>> 4) & 017 | 
        (data[sidx] << 4) & 077); 
     dest[didx+2] = (byte) ((data[sidx+2] >>> 6) & 003 | 
        (data[sidx+1] << 2) & 077); 
     dest[didx+3] = (byte) (data[sidx+2] & 077); 
    } 

    // 0-63 to ascii printable conversion 
    for (int idx = 0; idx <dest.length; idx++) 
    { 
     if (dest[idx] < 26)  dest[idx] = (byte)(dest[idx] + 'A'); 
     else if (dest[idx] < 52) dest[idx] = (byte)(dest[idx] + 'a' - 26); 
     else if (dest[idx] < 62) dest[idx] = (byte)(dest[idx] + '0' - 52); 
     else if (dest[idx] < 63) dest[idx] = (byte)'+'; 
     else   dest[idx] = (byte)'/'; 
    } 

    // add padding 
    for (int idx = dest.length-1; idx > (d.length*4)/3; idx--) 
    { 
     dest[idx] = (byte)'='; 
    } 
    return new String(dest); 
    } 

    /** 
    * Encode a String using Base64 using the default platform encoding 
    **/ 
    public final static String encode(String s) { 
    return encode(s.getBytes()); 
    } 

    /** 
    * Decode data and return bytes. 
    */ 
    public final static byte[] decode(String str) 
    { 
    if (str == null) return null; 
    byte data[] = str.getBytes(); 
    return decode(data); 
    } 

    /** 
    * Decode data and return bytes. Assumes that the data passed 
    * in is ASCII text. 
    */ 
    public final static byte[] decode(byte[] data) 
    { 
    int tail = data.length; 
    while (data[tail-1] == '=') tail--; 
    byte dest[] = new byte[tail - data.length/4]; 

    // ascii printable to 0-63 conversion 
    for (int idx = 0; idx <data.length; idx++) 
    { 
     if (data[idx] == '=') data[idx] = 0; 
     else if (data[idx] == '/') data[idx] = 63; 
     else if (data[idx] == '+') data[idx] = 62; 
     else if (data[idx] >= '0' && data[idx] <= '9') 
     data[idx] = (byte)(data[idx] - ('0' - 52)); 
     else if (data[idx] >= 'a' && data[idx] <= 'z') 
     data[idx] = (byte)(data[idx] - ('a' - 26)); 
     else if (data[idx] >= 'A' && data[idx] <= 'Z') 
     data[idx] = (byte)(data[idx] - 'A'); 
    } 

    // 4-byte to 3-byte conversion 
    int sidx, didx; 
    for (sidx = 0, didx=0; didx < dest.length-2; sidx += 4, didx += 3) 
    { 
     dest[didx] = (byte) (((data[sidx] << 2) & 255) | 
       ((data[sidx+1] >>> 4) & 3)); 
     dest[didx+1] = (byte) (((data[sidx+1] << 4) & 255) | 
       ((data[sidx+2] >>> 2) & 017)); 
     dest[didx+2] = (byte) (((data[sidx+2] << 6) & 255) | 
       (data[sidx+3] & 077)); 
    } 
    if (didx < dest.length) 
    { 
     dest[didx] = (byte) (((data[sidx] << 2) & 255) | 
       ((data[sidx+1] >>> 4) & 3)); 
    } 
    if (++didx < dest.length) 
    { 
     dest[didx] = (byte) (((data[sidx+1] << 4) & 255) | 
       ((data[sidx+2] >>> 2) & 017)); 
    } 
    return dest; 
    } 

    /** 
    * A simple test that encodes and decodes the first commandline argument. 
    */ 
    public static final void main(String[] args) 
    { 
    if (args.length != 1) 
    { 
     System.out.println("Usage: Base64 string"); 
     System.exit(0); 
    } 
    try 
    { 
     String e = Base64.encode(args[0].getBytes()); 
     String d = new String(Base64.decode(e)); 
     System.out.println("Input = '" + args[0] + "'"); 
     System.out.println("Encoded = '" + e + "'"); 
     System.out.println("Decoded = '" + d + "'"); 
    } 
    catch (Exception x) 
    { 
     x.printStackTrace(); 
    } 
    } 
} 

Đầu Chuyển đổi bitmap của bạn để ByteArray bằng đoạn mã sau:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
image.compress(Bitmap.CompressFormat.PNG, 100, baos); 
byte[] b = baos.toByteArray(); 

Để sử dụng cuộc gọi đường chuyền này byte [] hình ảnh bitmap của bạn:

base64Image = Base64.encode(b)); 

Bạn có thể kiểm tra xem nó bằng cách nhấn dòng sau trong trình duyệt của bạn, bạn sẽ thấy hình ảnh.

data:image/jpeg;base64,base64Image 
+0

Vâng ...Tôi đã thử mã của bạn ... và trên hình ảnh mà tôi đã đăng là từ mã này chỉ .... Tôi nhận được kết quả tương tự –

0

Khi tôi chuyển đổi mà Base64 để hình ảnh, tôi nhận được IMAGE INCOMPLETE

Cố gắng làm điều này với hình ảnh của bạn Bitmap và kiểm tra xem một cái gì đó không được như mong đợi:

Bitmap originalBitmap = (Bitmap) data.getExtras().get("data"); //or whatever image you want 
Log.d(TAG, "original bitmap byte count: " + originalBitmap.getByteCount()); 

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
originalBitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); 
Log.d(TAG, "byte array output stream size: " + baos.size()); 

byte[] outputByteArray = baos.toByteArray(); 
Log.d(TAG, "output byte array length: " + outputByteArray.length); 

String base64EncodedString = Base64.encodeToString(outputByteArray, Base64.DEFAULT); 
Log.d(TAG, "base64 encoded string length: " + base64EncodedString.length()); 

byte[] inputByteArray = Base64.decode(base64EncodedString, Base64.DEFAULT); 
Log.d(TAG, "input byte array length: " + inputByteArray.length); 

ByteArrayInputStream bais = new ByteArrayInputStream(inputByteArray); 
Log.d(TAG, "byte array input stream size: " + bais.available()); 

Bitmap decodedBitmap = BitmapFactory.decodeStream(bais); 
Log.d(TAG, "decoded bitmap byte count: " + decodedBitmap.getByteCount()); 

Log.d(TAG, "decoded bitmap same as original bitmap? " + decodedBitmap.sameAs(originalBitmap)); 

Nếu tất cả đều ổn thì vấn đề không phải là mã hóa base64. Cho tôi biết!

0

Ok, tôi đã giải quyết. vấn đề là trong việc lưu trữ chuỗi base64 trên cơ sở dữ liệu. cột của tôi đã được khai báo là "TEXT" và nó cắt các phần của hình ảnh khác bởi vì chiều dài của chuỗi. vì vậy tôi thay đổi nó thành "LONGTEXT" và bây giờ nó hoạt động hoàn hảo!

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