2013-06-04 3 views
2

Я использую библиотеку Android-Universal-Image-Loader для загрузки/кэширования удаленных изображений и долгое время искал источник, пытаясь найти способ получить исходное изображение размер (ширина и высота) для моего ImageLoadingListener.Универсальный загрузчик изображений получить исходный размер изображения

Образец кода, приведенный ниже, просто дает вам представление о том, что я пытаюсь сделать.

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(); 


    } 

Я попытался расширить класс ImageDecoder и класс ImageLoader найти окольный путь к связывающей декодер (из которого я могу получить исходный размер изображения в методе #prepareDecodingOptions) на мой пользовательском ImageLoadingListener. Но объект конфигурации является закрытым, а поля (включая декодер) недоступны из подклассов (и в любом случае они чувствуют себя слишком хакерским способом решения проблемы).

Я пропустил простой «встроенный» способ получения исходного размера изображения, не теряя при этом преимущества масштабирования/управления памятью UIL?

ответ

3

Невозможно передать исходный размер изображения с ImageDecoder на прослушиватель через параметры.

Я думаю, что решение для вас следующее. Продлить BaseImageDecoder и создать карту в нем для сохранения размеров изображений:

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

Затем переопределить defineImageSizeAndRotation(...):

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; 
} 

Примечание: info.imageSize не будет компилироваться, так как 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. И зачем создавать новую instacne из ImageFileInfo при возврате, что может быть неправильным, если вернуть 'info'? – xmen

+0

Кажется, я ошибся. Я скоро опубликую v1.8.7-SNAPSHOT с необходимыми изменениями. – NOSTRA

0

кажется, что вы не должны реализовывать собственные ImageLoadingListener, если вы хотите получить оригинальный размер загруженного изображения. Я использую метод loadImage, и, похоже, растровое изображение имеет размер источника. УИЛ 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); 


     } 
    }); 
Смежные вопросы