2017-09-07 7 views
1

안녕하세요 여러분, 서버에 이미지 파일을 업로드하는 프로젝트를 진행하고 있습니다. Volley을 사용하여 서버에 데이터를 보내고 있습니다. 전송할 데이터에는 base64 문자열이 포함되어 있습니다. 이미지 파일을 디코딩 할 때 OutOfMemoryError이 발생했습니다. 올바르게 구현합니까? 여기 내 코드는 다음과 같습니다.비트 맵을 디코딩 할 때 Android OutOfMemoryError

for (int i = 0; i < pathList.size(); i++) { 
    //error occurred here 
     Bitmap image = BitmapFactory.decodeFile(pathList.get(i), options); 
      Log.d("bitmapImage", "nisudSiya" + " " + image); 
      encodedImage = UploadImageHelper.encodeImageBitmap(UploadImageHelper.scaleBitmap(image, 1000, 1000)); 
      stringUri.add(encodedImage); 
     } 
     StringRequest stringRequest = new StringRequest(Request.Method.POST, POST_URL, new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 
       Toast.makeText(CreatePostActivity.this, response.toString(), Toast.LENGTH_SHORT).show(); 
       VolleyApp.getInstance().cancelPendingRequests(PUSH_MULTIPLE_IMAGES); 
       mProgressUpload.dismiss(); 
       finish(); 
       Log.d("tyler", response.toString()); 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       error.printStackTrace(); 
       Toast.makeText(CreatePostActivity.this, "Error Uploading!", Toast.LENGTH_SHORT).show(); 
       mProgressUpload.dismiss(); 
       Log.d("tagsdsad23", error.toString()); 
      } 
     }) { 
      @Override 
      protected Map<String, String> getParams() throws AuthFailureError { 

       for (int i = 0; i < stringUri.size(); i++) { 
        Attachment attachment = new Attachment(); 
        attachment.setType("image"); 
        attachment.setUrl(stringUri.get(i)); 
        shit.add(attachment); 
       } 
       Log.d("shitsize", String.valueOf(shit.size())); 
       JSONArray jsonArray = new JSONArray(); 
       for (int i = 0; i < shit.size(); i++) { 
        try { 
         JSONObject jsonObject = new JSONObject(); 
         Log.d("shittype", shit.get(i).getUrl()); 
         jsonObject.put("type", shit.get(i).getType()); 
         jsonObject.put("url", shit.get(i).getUrl()); 
         jsonArray.put(jsonObject); 
         Log.d("tyler-gwapa", jsonObject.toString()); 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
       Log.d("tyler-gwapa", jsonArray.toString()); 

       Map<String, String> params = new HashMap<String, String>(); 
       params.put(USER_TOKEN, userToken); 
       params.put(CAPTION, postContent.getText().toString()); 
       params.put(ATTACHMENT, jsonArray.toString()); 
       return params; 
      } 
     }; 
     VolleyApp.getInstance().addToRequestQueue(stringRequest, PUSH_MULTIPLE_IMAGES_TAG); 
+2

화상 .compress (Bitmap.CompressFormat.JPEG 100 정의 , outStream); 서버에 보내기 전에 이미지 압축 ...! –

+0

이미 입력 한 내용 : encodedImage = UploadImageHelper.encodeImageBitmap (UploadImageHelper.scaleBitmap (image, 1000, 1000)); –

+0

인코딩 된 이미지가 압축되지 않습니다 ..! 일단 이미지를 압축하면 이미지 크기가 줄어 듭니다. –

답변

0

서버로 보내기 전에 이미지 압축 ...!

나는 당신에게 도움이되기를 바랍니다 ...!

1

다음을 시도하여 비트 맵을 압축하고 인코딩하십시오.

Bitmap selectedImage = getResizedBitmap(yourBitmaptoCompress, 350, 350); 

getResizedBitmap 방법을

public Bitmap getResizedBitmap(Bitmap image, int bitmapWidth, int 
    bitmapHeight) { 
    return Bitmap.createScaledBitmap(image, bitmapWidth, bitmapHeight, 
    true); 
} 

인코딩 이미지 맵 (베이스 64)을 정의

String encodedImage = encodeImage(selectedImage); 

encodeImage 방법을

private String encodeImage(Bitmap bm) { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    bm.compress(Bitmap.CompressFormat.JPEG, 30, baos); 
    byte[] b = baos.toByteArray(); 
    String encImage = Base64.encodeToString(b, Base64.DEFAULT); 
    return encImage; 
} 
+0

비트 맵 selectedImage = getResizedBitmap (selectedImage, 350, 350); selectedImage가 두 번 사용됩니까? –

+0

업데이트 된 답변 –

+0

을 참조하십시오. H 및 W 값이 350 인 경우 350을 가져야합니까? 또는 어떻게 유래 350을 파생 시켰습니까? –