2013-06-04 5 views
2

Android 이미지를 로딩/캐싱하기 위해 Android-Universal-Image-Loader 라이브러리를 사용하고 원본 이미지를 검색하는 방법을 찾기 위해 원본을 통해 파고 들었습니다 크기 (너비 및 높이) ImageLoadingListener.Universal Image Loader 원래 이미지 크기 얻기

아래 샘플 코드는 내가하려는 일에 대한 아이디어 만 제공합니다.

protected class ViaImageLoadingListener implements ImageLoadingListener { 
    final SelectableImageView selectableImageView ; 


    protected ViaImageLoadingListener(SelectableImageView selectableImageView) { 
     this.selectableImageView = selectableImageView; 
    } 

    @Override 
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 

      selectableImageView.setImageBitmap(loadedImage); 
      // loadedImage.getWeight() will not return the original 
      // dimensions of the image if it has been scaled down 
      selectableImageView.setOriginalImageSize(width, height); 
      selectableImageView.invalidate(); 


    } 

내 사용자 정의 ImageLoadingListener에 디코더 (있는 나는 #prepareDecodingOptions 방법 원본 이미지의 크기를 얻을 수 있습니다) 연결에 라운드에 대한 방법을 찾기 위해 ImageDecoder 클래스와하여 ImageLoader 클래스를 확장 노력했다. 그러나 구성 객체는 private이며 필드 (디코더 포함)는 하위 클래스에서 액세스 할 수 없습니다 (어쨌든 문제를 해결하는 지나치게 고질적 인 방법처럼 느껴짐).

UIL의 스케일링/메모리 관리의 이점을 잃지 않고 원본 이미지 크기를 얻는 간단한 "내장"방식을 간과 했습니까?

답변

3

params를 통해 ImageDecoder에서 청취자에게 원본 이미지 크기를 전달할 방법이 없습니다.

나는 당신을위한 해결책이 다음과 같다고 생각합니다. BaseImageDecoder를 확장 및 이미지 크기를 유지하기 위해 그것에서지도를 만들 :

Map<String, ImageSize> urlToSizeMap = new ConcurrentHashMap<String, ImageSize>();

그런 다음 defineImageSizeAndRotation(...)를 오버라이드 (override) :

protected ImageFileInfo defineImageSizeAndRotation(InputStream imageStream, String imageUri) throws IOException { 
    ImageFileInfo info = super.defineImageSizeAndRotation(imageStream, imageUri); 
    urlToSizeMap.put(imageUri, info.imageSize); // Remember original image size for image URI 
    return info; 
} 

참고 : imageSize가 표시되지 않기 때문에 info.imageSize가 컴파일되지 않습니다. 다음 버전 (1.8.5)에서 수정 하겠지만 지금은 리플렉션을 사용할 수 있습니다.

이 디코더를 구성으로 설정하고 어디서나이 디코더를 참조하십시오 (또는 urlToSizeMap을 청취자가 액세스 할 수 있도록 고정시킬 수 있음). 리스너에서 다음

는 :

@Override 
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 
     selectableImageView.setImageBitmap(loadedImage); 

     ImageSize imageSize = decoder.urlToSizeMap.get(imageUri); 
     selectableImageView.setOriginalImageSize(imageSize.getWidth(), imageSize.getHeight()); 
     selectableImageView.invalidate(); 
} 
+0

imageSize 및 EXIF은 아직 공개되지 보호하고 나는 1.8.6를 사용하고 있습니다. 그리고 ImageFileInfo를 반환 할 때 새로운 instacne을 만드는 것이 왜'info'를 반환하면 잘못 될 수 있습니까? – xmen

+0

내가 실수 한 것 같습니다. 곧 필요한 변경 사항과 함께 v1.8.7-SNAPSHOT을 게시 할 예정입니다. – NOSTRA

0

당신이로드 된 이미지의 원래 크기를 얻으려면 당신이 자신의 ImageLoadingListener을 구현할 필요가 없습니다 것 같다. 내가 loadImage 메서드를 사용하고 그것은받은 비트 맵 원점 크기가 보인다. UIL v1.8.6

loader.loadImage(pin_url, option, new SimpleImageLoadingListener() { 
     @Override 
     public void onLoadingFailed(String imageUri, View view, 
            FailReason failReason) { 
      showErrorLayout(); 
     } 

     @Override 
     public void onLoadingComplete(String imageUri, View view, 
             Bitmap loadedImage) { 

      // width - device width 
      // height - OpenGl maxTextureSize 
      if (width < loadedImage.getWidth() || height < loadedImage.getHeight()) { 
       // handle scaling 
      } 

      iv.setImageBitmap(loadedImage); 


     } 
    }); 
관련 문제