2012-04-27 5 views
2

좋은 하루 동료 개발자.안드로이드 게시물 고해상도 이미지 메모리 부족 실행

안드로이드가 앱에서 이미지를 업로드하는 것이 바쁩니다.
나는 또한 그것 (코드는 아래에 따라 올 것이다) 일했다.
하지만 큰 이미지 (10 메가 픽셀)를 보낼 때 내 응용 프로그램이 메모리 부족 예외로 인해 중단됩니다.
압축을 사용하는 것이 해결책이지만 전체 크기 이미지를 보내려면 어떻게해야합니까?
아마 나는 물줄기가있는 것 같지만 물줄기가 아니란 것을 생각합니다. 아마 urlconnection 도움이 될 수도 있지만 정말 몰라.

내가 파일 이름을 이름 파일을 제공 [0 9999] .JPG 이미지 날짜 포스트 값은 내가

작동하지만 난 아래의 코드 dropboxid 포스트 값에 대한 UID를 제공 FILEDATA 라고 고해상도 이미지를 전송하지 못하게하는 내 문제를 해결하고 싶습니다. ByteArrayOutputStream를 사용하고 효과적으로 에게 JPEG가 사용하는 메모리의 양을 두 배로 #toByteArray()를 호출 할 때

종류

try 
{ 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    bitmap.compress(CompressFormat.JPEG, 100, bos); 
    byte[] data = bos.toByteArray(); 

    HttpPost postRequest = new HttpPost(URL_SEND); 

    ByteArrayBody bab = new ByteArrayBody(data, "File" + pad(random.nextInt(9999) + 1) + ".jpg"); 
    MultipartEntity reqEntity = new multipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
    reqEntity.addPart("Filedata", bab); 
    reqEntity.addPart("dropboxId", new StringBody(URLEncoder.encode(uid))); 
    postRequest.setEntity(reqEntity); 

    HttpResponse response = httpClient.execute(postRequest); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8")); 
    String sResponse; 
    StringBuilder s = new StringBuilder(); 

    while((sResponse = reader.readLine()) != null) 
    { 
     s = s.append(sResponse); 
    } 

    if(d) Log.i(E, "Send response:\n" + s); 
} 
catch (Exception e) 
{ 
    if(d) Log.e(E, "Error while sending: " + e.getMessage()); 
    return ERROR; 
} 

답변

3

을 간주한다. ByteArrayOutputStream은 인코딩 된 JPEG로 내부 배열을 유지하며 #toByteArray()을 호출하면 new 배열 &이 내부 버퍼의 데이터를 복사합니다.

큰 비트 맵을 & FileOutputStreamFileInputStream을 사용하여 이미지를 인코딩하고 전송하는 임시 파일로 인코딩하는 것이 좋습니다.

"업로드"하지 않고도 - 귀하의 앱이 내가 생각하는 메모리의 거대한 비트 맵을 "멋지게"유지합니다.

편집 : 내 응용 프로그램에서 FileBody

File img = new File(this is where you put the path of your image) 
ContentBody cb = new FileBody(img, "File" + pad(random.nextInt(9999) + 1) + ".jpg", "image/jpg", null); 
MultipartEntity reqEntity = new multipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
reqEntity.addPart("Filedata", cb); 
reqEntity.addPart("dropboxId", new StringBody(URLEncoder.encode(uid))); 
+0

은 내가 파일에 대한 참조 만 저장합니다. 따라서 파일은 이미 저장되어 있습니다 (SD 카드에 있음). 업로드를 시작할 때부터 비트 맵을 가져옵니다. 내 주요 문제는 내가 어떻게 그 파일 inputstream에서 얻을 수있는 내 실체와 함께 게시 할 수있는 outputstream로 변환 모르겠다. 비트 맵 코드 bitmap = BitmapFactory.decodeFile (경로); 그래서 여기에 내가 ByteArrayBody bab = fileinputstream (path) 같은 것을해야합니까? – user1195015

+0

그래서 .. 왜 비트 맵을 가져올까요? 원본 파일이 PNG이고 웹 서버가 PNG 만 허용합니까? 그렇지 않으면 - 단지 당신이 이미 가지고있는 파일을 업로드하십시오 - JPEG를 다시 인코딩하면 이미지에 더 이상한 유물이 생길 것입니다. ** 편집 ** : 추가 아파치 라이브러리를 가져 왔습니까? 이 경우'FileBody' 클래스가 있어야합니다. 그것을 사용할 수 있습니까 – Jens

+0

내가 좋아하는 거의 모든 파일 형식을 보낼 수 있습니다. 하지만 여전히 파일에서 바이트를 가져 오는 방법에 대한 단서가 없습니다. 그러나 아이디어는 좋기 때문에 나는 그것에 google을 갈 것이라고 생각한다. 또는 간단한 예를 들어 보면 좋을 것입니다. 내가 뭔가를 찾으면 나는 그것을 게시 할 것이다. 조언 주셔서 감사합니다 – user1195015