2011-03-30 2 views
1

웹에서 jpg 이미지를 다운로드하여 바이트 배열에 저장하려고 시도 할 때까지 RAM에 압축 된 이미지가 있어야합니다. 그것을 보여라. 그러나 나는 검은 그림을 얻고있다.RAM에서 바이트 배열로 저장하는 웹에서 jpg 이미지 다운로드

는 내가하고 있어요 것은 : 나는 그것을 사용하는 때까지 그 후

URL myFileUrl =null; 

myFileUrl= new URL(fileUrl); 

HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection(); 
conn.setDoInput(true); 
conn.connect(); 
conn.setUseCaches(false); 

InputStream is = conn.getInputStream(); 

byte[] ba = new byte[is.available()]; 

내가 RAM의 배열을 유지하고있다.

그것을 배치하려면 , 내가 할 :

Bitmap bitmapFromByteArray = BitmapFactory.decodeByteArray(ba,0,ba.length); 

imageView1.setImageBitmap(bitmapFromByteArray); 

bitmapFromByteArray.recycle(); 

난 후 JPEG 및 디코딩하고있어이 작업을 수행하여

URL myFileUrl =null; 

myFileUrl= new URL(fileUrl); 

HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection(); 
conn.setDoInput(true); 
conn.connect(); 

InputStream is = conn.getInputStream(); 

Bitmap bm = BitmapFactory.decodeStream(is); 

int size = bm.getWidth() * bm.getHeight(); 

ByteArrayOutputStream out = new ByteArrayOutputStream(size); 
bm.compress(Bitmap.CompressFormat.JPEG, 100, out); 

byte[] ba2 = out.toByteArray(); 
bm.recycle() 

Buut를 수행하여 문제를 해결 이미지를 여러 번 다시 인코딩 그림의 품질을 낮추고 전화 리소스를 필요한 것보다 오래 사용하십시오. 또한 다시 인코딩 한 후에 얻는 비트 맵은 원본 jpg 이미지보다 큽니다.

첫 번째 방법을 사용할 수있는 방법이 있습니까?

감사합니다.

답변

0

InputStream의 내용을 단순히 바이트 배열로 복사하려고합니까?

InputStream#read을 바이트 배열로 호출하는 루프에서 직접 수행하거나 Apache commons의 IOUtils.toByteArray을 사용하여 구현을 다른 상태로 둘 수 있습니다.

편집 - 아파치 평민 방법을 사용하는 경우가 배열 초기화를 처리 할 필요가 없습니다 :

byte[] bytes = null; 
try { 
    bytes = IOUtils.toByteArray(conn.getInputStream()); 
} catch (IOException e) { 
    // handle the exception 
} 

toByteArray 배열 선행 할당을 피하기 위해 ByteArrayOutputStream를 사용을하지만 같으면 ' 이것에 대해 걱정할 필요가 없다.

+0

예, 멍청한 질문입니다. 문제는 바이트 배열을 초기화하는 방법을 모른다는 것입니다. 얼마나 오래 있어야 하죠? 어쩌면 아파치 공유지 (IOUtils) 예제가 있습니까? –

+0

탱크 있습니다. 이전에 (비트 맵과 같은 이미지를 저장할 때) memoryOutOfBoundsException을 던지는 데 사용되는 응용 프로그램은 아니 었으며 jpg (또는 jpg 종류)로 저장하거나 품질을 유지할 수도 없었습니다. –

+0

IOUtils를 찾을 수 없습니다. 패키지가 포함되어 있다고 말할 수 있습니까? Niether org.apache.commons에 io가 있습니다. 그래서 org.apache.commons.io.IOUtils에 액세스 할 수 없습니다. – Debopam

0
  1. byte[] ba = new byte[is.available()]; 필요한 바이트를 얻지는 않습니다. 바이트를 가져 오는 가장 쉬운 방법은 Apache commons (IOUtils)를 사용하는 것입니다. 두 번째 방법은 HTTP 입력 스트림에서 직접 비트 맵을 디코딩합니다. 또한 가능하지만 먼저 다운로드하고 디코딩하는 것이 좋습니다. 또한 디코딩 후 비트 맵을 압축 할 필요가 없습니다. 그냥 사용하십시오.
  2. 비트 맵을 사용하지 않을 때는 재활용해야합니다. 나는 당신이 그 곳에서 bitmapFromByteArray.recycle();으로 전화를 할 수 있다고 생각하지 않습니다.
+0

"사용하지 않을 때는 비트 맵을 재활용해야합니다. 그 위치에서 bitmapFromByteArray.recycle();을 호출 할 수 있다고 생각지 않습니다." 당신 말이 맞아요. 왜 내가 여기있는 것 같아요? 나는 그것을 내 앱에서 좋아하지 않는다. –

관련 문제