【问题标题】:Universal Image Loader Load bitmap from memoryUniversal Image Loader 从内存中加载位图
【发布时间】:2015-03-13 01:23:53
【问题描述】:

Universal Image Loader 提供了多种加载图像的方法。

"file:///mnt/sdcard/image.png" // from SD card
"file:///mnt/sdcard/video.mp4" // from SD card (video thumbnail)
"content://media/external/images/media/13" // from content provider
"content://media/external/video/media/13" // from content provider (video thumbnail)
"assets://image.png" // from assets
"drawable://" + R.drawable.img // from drawables (non-9patch images)

但是所有这些方式加载图像表单文件,我需要一种从内存加载的方法,因为我的图像被加密并存储在 assets 文件夹中,当我显示这个图像时,我需要以下步骤。

  1. 将图像解密为字节数组。
  2. 从字节创建位图。
  3. 加载/显示图像。

所以它是这样的。这可能吗?

Bitmap bitmap = decrypt(encryptedImageFile);
imageLoader.displayImage(bitmap, imageView);

目前,我正在考虑将位图保存到文件并加载文件,但这需要更多时间。

【问题讨论】:

    标签: android bitmap universal-image-loader


    【解决方案1】:

    如果您的图片存储在 assets 目录的 image 文件夹中,我相信以下是您正在寻找的,那么您可以获得图片列表

      private List<String> getImage(Context conetx) throws IOException { 
          AssetManager assetManager =conetx.getAssets();
          String[] files = assetManager.list("image");   
          List<String> it=Arrays.asList(files);
          return it; 
      } 
    

    请注意,不要使用 assets dir,而是将文件放入 /res/raw,然后您可以使用以下 URI 访问它

    android.resource://com.your.packagename/" + R.raw.<nameoffile>
    

    【讨论】:

    • 不,我想从内存中加载图像。我知道如何从 assets 文件夹中读取文件,谢谢。
    【解决方案2】:

    我认为您需要了解这一点。你一定知道,如果你看过universal-image-loader的源码,在提供图片的url后,将图片加载到ImageView的顺序是:内存、SDCard(如果设置)、internet。这意味着在您调用ImageLoader.display(url, imageview); 之后,它会从memory first 中查找Bitmap,如果它不存在,则会从@987654326 中查找图像文件@then,如果文件存在,如果将文件转换为Bitmap,然后将Bitmap加载到ImageView中并存储在内存中。但是如果文件不存在,它会下载url的图像文件,然后将文件存储到SDCard中,并将文件转换为Bitmap并将Bitmap加载到内存中。 最重要的是,如果您对我上面发布的内容感到困惑,我建议您阅读它的源代码。

    因此,您无需从内存中加载BitmapImageLoader 会为您完成。

    【讨论】:

    • 我知道这个过程,但是我需要显示加密的图像,如果我不从内存中读取它,我有机会解密它。解决方法是解密图像,然后将其存储到 SD 卡,然后通过 UIL 显示,但这需要很多时间并且性能很差。
    【解决方案3】:

    让我们选择自己的方案,以便我们的 URI 看起来像“stream://...”。

    然后实现ImageDownloader。我们应该使用我们的方案捕获 URI 并返回图像流。

    public class StreamImageDownloader extends BaseImageDownloader {
        private static final String SCHEME_STREAM = "stream";
        private static final String STREAM_URI_PREFIX = SCHEME_STREAM + "://";
    
        public StreamImageDownloader(Context context) {
            super(context);
        }
    
        @Override
        protected InputStream getStreamFromOtherSource(String imageUri, Object extra) throws IOException {
            if (imageUri.startsWith(STREAM_URI_PREFIX)) {
                return (InputStream) extra;
            } else {
                return super.getStreamFromOtherSource(imageUri, extra);
            }
        }
    }
    
    
    DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
                .build();
    
    
    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
            .defaultDisplayImageOptions(defaultOptions)
            .imageDownloader(new StreamImageDownloader(getApplicationContext()))
            .build();
    
    ImageLoader.getInstance().init(config);
    
    
    
        ByteArrayInputStream stream = new ByteArrayInputStream(imgBytes);
        String imageId = "stream://" + stream.hashCode();
        DisplayImageOptions options = new DisplayImageOptions.Builder()
                .extraForDownloader(stream)
                .build();
        ImageLoader.getInstance().displayImage(imageId, imageView, options);
    

    【讨论】:

      猜你喜欢
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      • 2020-03-24
      • 1970-01-01
      • 2014-03-24
      • 2014-05-19
      • 1970-01-01
      • 2012-12-14
      相关资源
      最近更新 更多