2011-09-25 3 views
1

업데이트 : 캐시에서 이미지를 검색하지 않더라도 "drawable-mdpi"파일에 18 개의 이미지를 모두 저장 한 Drawable을 통해 검색하려고했습니다. 폴더. 여전히 빈 화면이 표시되었습니다.안드로이드에서 BitmapFactory.decodeStream()을 사용하여 캐시에서 이미지로드

서버에서 이미지를 검색하고 이미지 (.GIF)를 캐시에 저장할 수있었습니다. 그러나 캐시에서 해당 이미지를로드해야 할 때 이미지가 화면에 표시되지 않습니다. 이미지의 URL을 저장하는가 (이미지 이름은 또한 URL에서 확인할 수 있습니다) smallMapImageNames

의 ArrayList : 이미지의 이름을 저장

File cacheDir = context.getCacheDir(); 

      File cacheMap = new File(cacheDir, smallMapImageNames.get(i).toString()); 
      if(cacheMap.exists()){ 
       FileInputStream fis = null; 
       try { 
        fis = new FileInputStream(cacheMap); 
        Bitmap local = BitmapFactory.decodeStream(fis); 
        puzzle.add(local); 
       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } 

      }else{ 
       Drawable smallMap = LoadImageFromWebOperations(mapPiecesURL.get(i).toString()); 
       if(i==0){ 
        height1 = smallMap.getIntrinsicHeight(); 
        width1 = smallMap.getIntrinsicWidth(); 
       } 
       if (smallMap instanceof BitmapDrawable) { 
        Bitmap bitmap = ((BitmapDrawable)smallMap).getBitmap(); 
        FileOutputStream fos = null; 
        try { 
         cacheMap.createNewFile(); 
         fos = new FileOutputStream(cacheMap); 
         bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); 
         fos.flush();  
         fos.close(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        }  

        puzzle.add(bitmap); 
       } 
      } 

ArrayList에 다음은 작업을 수행하는 코드입니다 : mapPiecesURL

총 2 가지 질문이 있습니다. 1) 캐시에서 이미지를로드하는 방법은 무엇입니까? 2) bitmap.compress()와 관련하여 서버의 이미지는 .GIF 형식이지만 Bitmap.CompressFormat.PNG를 적용합니다. 이것에 어떤 문제가있을 것입니까?

아무도 도와 줄 수 있습니까?

두 기능

private Bitmap getBitMap(Context context) { 
     // TODO Auto-generated method stub 
     WifiPositioningServices wifiPositioningServices = new WifiPositioningServices(); 

     String[] mapURLandCalibratedPoint1 = wifiPositioningServices.GetMapURLandCalibratedPoint("ERLab-1_1.GIF","ERLab"); //list of map pieces url in the first 9 pieces 
     String[] mapURLandCalibratedPoint2 = wifiPositioningServices.GetMapURLandCalibratedPoint("ERLab-4_1.GIF","ERLab"); //list of map pieces url in the last 9 pieces 
     ArrayList<String> smallMapImageNames = new ArrayList<String>(); 
     ArrayList<String> mapPiecesURL = new ArrayList<String>(); 

     for(int i=0; i<mapURLandCalibratedPoint1.length; i++){ 
       if(mapURLandCalibratedPoint1[i].length()>40){ //image url 
        int len = mapURLandCalibratedPoint1[i].length(); 
        int subStrLen = len-13; 
        smallMapImageNames.add(mapURLandCalibratedPoint1[i].substring(subStrLen, len-3)+"JPEG"); 
        mapPiecesURL.add(mapURLandCalibratedPoint1[i]); 
       } 
       else{ 
        //perform other task 
       } 

     } 

     for(int i=0; i<mapURLandCalibratedPoint2.length; i++){ 
      if(mapURLandCalibratedPoint2[i].length()>40){ //image url 
       int len = mapURLandCalibratedPoint2[i].length(); 
       int subStrLen = len-13; 
       smallMapImageNames.add(mapURLandCalibratedPoint2[i].substring(subStrLen, len-3)+"JPEG"); 
       mapPiecesURL.add(mapURLandCalibratedPoint2[i]); 
      } 
      else{ 
       //perform other task 
      }  
     } 
     Bitmap result = Bitmap.createBitmap(1029, 617, Bitmap.Config.ARGB_8888); 
     Canvas canvas = new Canvas(result); 
     ArrayList<Bitmap> puzzle = new ArrayList<Bitmap>(); 

     int height1 = 0 ; 
     int width1 = 0; 

     File cacheDir = context.getCacheDir(); 

     for(int i=0; i<18; i++){     
      File cacheMap = new File(cacheDir, smallMapImageNames.get(i).toString()); 
      if(cacheMap.exists()){ 
       //retrieved from cached 
       try {   
        FileInputStream fis = new FileInputStream(cacheMap);     
        Bitmap bitmap = BitmapFactory.decodeStream(fis); 
        puzzle.add(bitmap); 
       } catch (FileNotFoundException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

      }else{ 
       //retrieve from server and cached it 
       Drawable smallMap = LoadImageFromWebOperations(mapPiecesURL.get(i).toString()); 
       if(i==0){ 
        height1 = smallMap.getIntrinsicHeight(); 
        width1 = smallMap.getIntrinsicWidth(); 
       } 
       if (smallMap instanceof BitmapDrawable) { 
        Bitmap bitmap = ((BitmapDrawable)smallMap).getBitmap(); 
        FileOutputStream fos = null; 
        try { 
         cacheMap.createNewFile(); 
         fos = new FileOutputStream(cacheMap); 
         bitmap.compress(CompressFormat.JPEG, 100, fos); 
         fos.flush();  
         fos.close(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        }  

        puzzle.add(bitmap); 
       } 
      }  
     } 

     Rect srcRect; 
     Rect dstRect; 
     int cnt =0; 


     for (int j = 0; j < 3; j++) { 
      int newHeight = height1 * (j % 3); 
      for (int k = 0; k < 3; k++) { 
       if (j == 0 && k == 0) { 
        srcRect = new Rect(0, 0, width1, height1); 
        dstRect = new Rect(srcRect); 
       } else { 
        int newWidth = width1 * k; 
        srcRect = new Rect(0, 0, width1, height1); 
        dstRect = new Rect(srcRect); 
        dstRect.offset(newWidth, newHeight); 
       } 
       canvas.drawBitmap(puzzle.get(cnt), srcRect, dstRect,null); 
       cnt++; 
      } 
     } 

     for(int a=0; a<3; a++){ 
      int newHeight = height1 * (a % 3); 
      for (int k = 3; k < 6; k++) { 
       if (a == 0 && k == 0) { 
        srcRect = new Rect(0, 0, width1*3, height1); 
        dstRect = new Rect(srcRect); 
       } else { 
        int newWidth = width1 * k; 
        srcRect = new Rect(0, 0, width1, height1); 
        dstRect = new Rect(srcRect); 
        dstRect.offset(newWidth, newHeight); 
       } 
       canvas.drawBitmap(puzzle.get(cnt), srcRect, dstRect, 
         null); 
       cnt++; 
      } 
     } 
     return result; 
    } 

    private Drawable LoadImageFromWebOperations(String url) { 
     // TODO Auto-generated method stub 
     try 
     { 
      InputStream is = (InputStream) new URL(url).getContent(); 
      Drawable d = Drawable.createFromStream(is, "src name"); 
      return d; 
     }catch (Exception e) { 
      System.out.println("Exc="+e); 
      return null; 
     } 
    } 

나는 실제로 배치도를 형성하기 위해 이미지 18 개 (3 × 6)을 표시하려합니다. 그래서 이미지를 표시하기 위해 두 개의 for-loop를 사용하여 표시합니다. 두 개의 .GIF 이미지, ERLab-1_1.GIF 및 ERLab-4_1.GIF는 각 그룹의 중심 부분입니다. 예를 들어, 첫 번째 행은 ERLab-0_0.GIF, ERLab-1_0.GIF, ERLab-2_0.GIF, ERLab-3_0.GIF, ERLab-4_0.GIF, ERLab-5_0.GIF가됩니다. 두 번째 행은 세 번째 행에 대해 XXX-X_1.GIF 및 XXX-X_2.GIF가됩니다.

마지막으로는 된 onDraw 함수에서 다음

Bitmap resultMap = getBitMap(this.getContext()); 
bmLargeImage = Bitmap.createBitmap(1029 , 617, Bitmap.Config.ARGB_8888); 
bmLargeImage = resultMap; 

캔버스에 이미지를 그리는 것입니다.

+0

퍼즐이란 무엇입니까? – Blackbelt

+0

미안하지만,이 점을 언급하는 것을 잊어 버렸습니다. 모든 비트 맵 이미지를 캐시 (이미지가 이미 캐시에서 사용 가능한 경우) 또는 서버에서 검색 한 후 저장하는 또 다른 ArrayList입니다. – user918197

+0

'decodeStream'가 성공적으로 비트 맵을 반환하고 있습니까? – Ronnie

답변

2

방금 ​​내 자신의 질문을 해결했습니다.

이 줄에서 은 for-loop 내에서 비트 맵을 캔버스에 그려 넣기 위해 ArrayList (퍼즐)의 각 항목을 Bitmap으로 캐스팅해야합니다. 그래야만 이미지가 표시됩니다.

ArrayList가 확실한 경우 ArrayList<Bitmap> puzzle = new ArrayList<Bitmap>(); ArrayList의 각 항목이 Bitmap 유형이 될 것이라고 생각했습니다. 그러나 그것이 항상 사실이 아닌가?

관련 문제