Universal Image Loader获得原始图像大小

时间:2013-06-04 04:00:26

标签: android universal-image-loader image-size

我正在使用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的循环方法。但是配置对象是私有的,并且字段(包括解码器)无法从子类中访问(并且感觉就像是一种解决问题的过于hacky方式)。

我是否忽略了一种简单的“内置”方式来获取原始图像大小而不会失去UIL扩展/内存管理的好处?

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分: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);


        }
    });