2014-07-01 84 views
2

在我的應用程序中,我得到一個用戶的配置文件圖片,然後將它保存爲串行化類作爲字符串。從Base64和GZIP解壓縮位圖

我做GZIP壓縮和使用的Base64下面的代碼,但是當你在getProfilePicture()方法見進一步下跌,我不能做相反的事情:

private void saveBitmap(){ 
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
    mBitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream); 
    byte[] byteArray = byteArrayOutputStream.toByteArray(); 
    String bitmapContent = ""; 
    try { 
     bitmapContent = FileHelpers.compressAndBase64(byteArray); 
     //later save it... 
     } catch (IOException e) { 
      e.printStackTrace(); 
      Log.e(TAG, "Error converting bitmap to gzip and base64"); 
     } 
} 


public static String compressAndBase64(byte[] byteArray) 
     throws IOException { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    GZIPOutputStream zos = new GZIPOutputStream(baos); 
    zos.write(byteArray); 
    zos.close(); 
    byte[] bytes = baos.toByteArray(); 
    return Base64.encodeToString(bytes, Base64.DEFAULT); 
} 

現在我想將其轉換回位圖...但到目前爲止,我沒有成功。

這些步驟將字符串從Base64解碼回字節數組,然後解壓縮字節數組並轉換爲位圖。

public Bitmap getProfilePicture(){ 

     if(getProfilePhotoBase64() != null) { 
      byte[] decoded = Base64.decode(mProfilePhotoBase64.getBytes(), Base64.DEFAULT); 
      final int BUFFER_SIZE = 32; 
      ByteArrayInputStream is = new ByteArrayInputStream(decoded); 
      GZIPInputStream gis = null; 
      try { 
       gis = new GZIPInputStream(is, BUFFER_SIZE); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      StringBuilder string = new StringBuilder(); 
      byte[] data = new byte[BUFFER_SIZE]; 
      int bytesRead; 
      try { 
       while ((bytesRead = gis.read(data)) != -1) { 
        string.append(new String(data, 0, bytesRead)); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      try { 
       gis.close(); 
       is.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      byte[] byteArray = string.toString().getBytes(); 
      Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0,byteArray.length); 

      if(bitmap != null) { 
       return bitmap; 
      } else { 
       return null; 
      } 
     } 

     return null; 
    } 

這是錯誤消息我得到使用上面的代碼:

--- SkImageDecoder::Factory returned null 

我可以做到這一點在PHP中很容易,但它的織補很難使其在Java的工作!

if(isset($_POST["photo"])) { 

    $photoContent = $_POST["photo"]; 
    $photo = imap_base64 ($photoContent); 
    $photo = gzdecode($photo); 

    $filename = $_POST["username"].".png"; 

    $dir = SITE_ROOT_PATH."/images/".$user."/".$filename; 
    file_force_contents($dir, $photo); 

} else { 
    $filename = "NO_PROFILE_PHOTO"; 
} 

回答

1

好,我設法解決這樣的問題:

/** 
* IMPORTANT NOTE!!!!!!!!!!!!!! 
* String is first converted to byte array, then compressed using GZIP and then 
* the resulting byte array is encoded to Base64.DEFAULT 
* @return 
*/ 
public String getProfilePhotoBase64() { 
    return mProfilePhotoBase64; 
} 

public Bitmap getProfilePicture(){ 
    if(getProfilePhotoBase64() != null) { 
     byte[] decoded = Base64.decode(mProfilePhotoBase64.getBytes(), Base64.DEFAULT); 

     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     ByteArrayInputStream bis = new ByteArrayInputStream(decoded); 

     GZIPInputStream zis = null; 
     try { 
      zis = new GZIPInputStream(bis); 
      byte[] tmpBuffer = new byte[256]; 
      int n; 
      while ((n = zis.read(tmpBuffer)) >= 0) { 
       bos.write(tmpBuffer, 0, n); 
      } 
      zis.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     Bitmap bitmap = BitmapFactory.decodeByteArray(bos.toByteArray(), 0 
       , bos.toByteArray().length); 

     if(bitmap != null) { 
      return bitmap; 
     } else { 
      return null; 
     } 
    } 
    return null; 
} 
+0

你應該告訴你改變了什麼,爲什麼。 – greenapps

0

究竟是什麼問題? compressAndBase64()將返回一個空字符串,因爲boas剛剛創建,因此boas.toByteArray()將返回0字節。你不需要創建一個boas。只要改變

return Base64.encodeToString(bytes, Base64.DEFAULT); 

return Base64.encodeToString(byteArray, Base64.DEFAULT); 
+0

'boas.toByteArray()'宣佈過,所以它確實很努力好,它壓縮和base64的位圖,但我不能相反的事情。我可以在PHP中解壓縮base64和gzip,所以壓縮代碼工作得很好。 –

+0

對不起。我監督你壓縮byteArray boas。但是,如果我使用encodeToString進行編碼,那麼我會使用decodeFromString來解碼。或者使用pair()/ decode()。 – greenapps

+0

有沒有這樣的方法(如果它有任何區別) –