2013-02-23 2 views
0

체로키 웹 서버의 이미지를 표시하는 앱을 작성하고 싶습니다.Android에서 이미지 미리보기를 표시하는 방법?

@Override 
protected Bitmap doInBackground(URL... params) { 
    URL urlToDownload = params[0]; 
    String downloadFileName = urlToDownload.getFile(); 
    downloadFile = new File(applicationContext.getCacheDir(), downloadFileName); 
    new File(downloadFile.getParent()).mkdirs(); // create all necessary folders 

    // download the file if it is not already cached 
    if (!downloadFile.exists()) { 
     try { 
      URLConnection cn = urlToDownload.openConnection(); 
      cn.connect(); 
      cn.setReadTimeout(5000); 
      cn.setConnectTimeout(5000); 
      InputStream stream = cn.getInputStream(); 

      FileOutputStream out = new FileOutputStream(downloadFile); 
      byte buf[] = new byte[16384]; 
      int numread = 0; 
      do { 
       numread = stream.read(buf); 
       if (numread <= 0) break; 
       out.write(buf, 0, numread); 
      } while (numread > 0); 
      out.close(); 
     } catch (FileNotFoundException e) { 
      MLog.e(e); 
     } catch (IOException e) { 
      MLog.e(e); 
     } catch (Exception e) { 
      MLog.e(e); 
     } 
    } 

    if (downloadFile.exists()) { 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inSampleSize = 16; 
     return BitmapFactory.decodeFile(downloadFile.getAbsolutePath(), options); 
    } else { 
     return null; 
    } 
} 

이 작동하지만, 내가 다운로드해야 이미지가 매우 큰 (메가 바이트)이기 때문에 그것은 아무것도 볼 수있는 사용자까지 약간의 시간이 소요 : 나는 다음과 같은 코드로 이미지를 다운로드 않습니다.

웹 브라우저와 마찬가지로 전체 이미지를로드하는 동안 이미지의 저해상도 미리보기를 표시하려고합니다. 어떻게해야합니까? BitmapFactory는 완전히로드 된 파일이나 스트림을 받아 들일뿐 아니라 디코딩 전에 완전히 다운로드 된 것으로 보입니다.

서버에는 고해상도 이미지 만 있습니다. 다운로드가 완료되기 전에 이미 다운로드 한 이미지의 모든 부분을 보여 주기만하면됩니다. 그렇게하면 사용자가 찾고 있던 그림이 아니라고 즉시 다운로드를 중단 할 수 있습니다.

답변

0

가장 쉬운 방법은 두 개의 이미지를 다운로드하는 것입니다. 하나는 작고 (몇 바이트라고합시다) 큰 이미지를 백그라운드로로드하는 동안 크기를 올리면 (끔찍할 것입니다 만 진행의 개념을 부여합니다). 작은 것보다 먼저 작은 것이 반환되고 낮은 해상도에서 높은 해상도로가는 것처럼 보이게 할 수 있습니다.

+0

불행히도 서버를 변경할 수 없습니다. – hin

+0

Android는 프로그레시브 JPEG를 지원하지만 부분적으로 디코딩하도록 디코더를 사용할 수 있는지는 확실하지 않습니다. 가장 가능성있는 방법은 원래의 이미지를 파일에 저장 한 후 write()를 시도하고 비동기 적으로 읽은 후에 시도하는 것입니다. 그렇게하면 프로그레시브 JPEG 인 경우 부분 해독 될 수 있습니다. 그러나 서버 구성 요소를 변경할 수 없기 때문에 스크래핑하는 사이트와 점진적 jpeg를 제공하지 않는 사이트가 있습니다. 아마도 진행률 표시기를 표시하는 것이 더 좋습니다 –

0

약 2 AsyncTask? 첫 번째 것은 작거나 낮은 해상도의 이미지를 다운로드하여 첫 번째 AsyncTask가 전체 이미지를 다운로드하는 두 번째 AsyncTask를 호출 한 후 ImageView에 표시합니다.

+0

불행히도 서버를 변경할 수 없습니다. 이 서버에는 작은 크기의 이미지가 없습니다. 다운로드하는 동안 이미 다운로드 한 모든 것을 보여주고 싶습니다. 큰 그림을 열 때 어떤 웹 브라우저처럼 작동합니다. – hin

관련 문제