2016-06-28 15 views
5

Tôi có một máy chủ có nhiều ảnh từ 1,5 kb đến 9 Mb. Ảnh từ PC, máy tính bảng và điện thoại. Máy chủ mã hóa chúng thành chuỗi Base64 và sau đó gửi chúng đến máy khách Android. Một hình ảnh 300 kb trả về null khi giải mã trong BitmapFactory.decodeByteArray ... Nhưng đó là hình ảnh hợp lệ và được giải mã tốt trong bộ giải mã trực tuyến. ?!Android BitmapFactory trả về null trên mảng byte được giải mã Base64

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

Đối với 2 ngày tôi không thể tìm thấy câu trả lời (

Bất kỳ ý tưởng Nhờ

PS

private boolean decodeImage64(String uid, String image64, String name) { 
    Bitmap decodedByte; 
    boolean result = false; 
    if (image64 != null && !image64.isEmpty()) { 

     try { 
      Log.e(TAG, "decodeImage64: image64.getBytes().length = " + image64.getBytes().length); 
      byte[] decodedString = Base64.decode(image64, Base64.DEFAULT); 
      Log.e(TAG, "decodeImage64: decodedString = " + decodedString + " , decodedString.length = " + decodedString.length); 
      decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length); 
      Log.e(TAG, "decodeImage64: decodedByte = " + decodedByte); 

      if (decodedByte != null) { 
       FileOutputStream out = null; 
       try { 
        out = new FileOutputStream(getImageFolderName() + "/" + uid + ".png"); 
        decodedByte.compress(Bitmap.CompressFormat.PNG, 100, out); 
        decodedByte.recycle(); 
        out.close(); 

       } catch (Exception e) { 
        Log.e(TAG, Log.getStackTraceString(e)); 
       } finally { 
        try { 
         if (out != null) { 
          out.close(); 
         } 
         if (decodedByte != null){ 
          decodedByte.recycle(); 
         } 
        } catch (IOException e) { 
         Log.e(TAG, Log.getStackTraceString(e)); 
        } 
       } 
       result = true; 
      }else { 
       Log.e(TAG, " !!!!!!!!!!!!!!!!!!!!!!! decodeImage64: decodedByte = null " + name); 
      } 
     }catch (Exception e){ 
      Log.e(TAG, Log.getStackTraceString(e)); 
     } 
    } else { 
     Log.e(TAG, "decodeImage64: image = null " + name); 
    } 
    return result; 
} 

Và logcat

hình ảnh tốt:

06-29 02:33:57.465 18197-18584/cps.agrovisio E/myLogs: ------------------------- doInBackground: Good photo 
06-29 02:34:13.993 18197-18584/cps.agrovisio E/myLogs: decodeImage64: image64.getBytes().length = 2264744 
06-29 02:34:14.085 18197-18584/cps.agrovisio E/myLogs: decodeImage64: decodedString = [[email protected] , decodedString.length = 1676499 
06-29 02:34:14.635 18197-18584/cps.agrovisio E/myLogs: decodeImage64: decodedByte = [email protected] 

hình ảnh xấu:

06-29 02:33:56.041 18197-18584/сps.agrovisio E/myLogs: ------------------------- doInBackground: Bad photo 
06-29 02:33:57.177 18197-18584/cps.agrovisio E/myLogs: decodeImage64: image64.getBytes().length = 372570 
06-29 02:33:57.194 18197-18584/cps.agrovisio E/myLogs: decodeImage64: decodedString = [[email protected] , decodedString.length = 275799 
06-29 02:33:57.245 18197-18584/cps.agrovisio E/myLogs: decodeImage64: decodedByte = null 
+0

điều gì khác biệt với hình ảnh, ngoại trừ kích thước của chúng? – goto

+0

Bạn tôi có thể cho chúng tôi hình ảnh của bạn để dùng thử không? –

+0

Tất cả ảnh jpg. Sự cố từ Android Tablet –

Trả lời

0

Điều này có thể không phải là câu trả lời bạn đang tìm kiếm nhưng bạn đã xem là sử dụng một khuôn khổ? Tôi đã sử dụng Picasso và nó dễ dàng như: Picasso.with (ngữ cảnh) .load ("http://i.imgur.com/DvpvklR.png") .into (imageView);

http://square.github.io/picasso/

+0

Cảm ơn! Nhưng tôi không thể sử dụng Picasso. Tôi có một vài thông số trong json, hình ảnh trong base64 một trong số chúng –

0

Slice phần data:image/jpg;base64, từ image64. Chỉ có chuỗi được mã hóa.

Bạn có thể sử dụng phương thức chuỗi con cho việc này, phương thức này sẽ hoạt động.

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