Android 通用图像加载程序从内存加载位图

Android 通用图像加载程序从内存加载位图,android,bitmap,universal-image-loader,Android,Bitmap,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

通用图像加载器提供了许多加载图像的方法

"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文件夹中,当我显示此图像时,我需要以下步骤

  • 将图像解密为字节数组
  • 从字节创建位图
  • 加载/显示图像
  • 是这样的。可能吗

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

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

    我相信下面是您正在寻找的内容。如果您的图像存储在资产目录的图像文件夹中,那么您可以获得图像列表

      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; 
      } 
    
    private List getImage(Context conetx)抛出IOException{
    AssetManager AssetManager=conetx.getAssets();
    String[]files=assetManager.list(“图像”);
    List it=Arrays.asList(文件);
    归还它;
    } 
    
    请注意,不要使用assets dir,而是将文件放入/res/raw,然后可以使用以下URI访问它

    android.resource://com.your.packagename/" + R.raw.<nameoffile>
    
    android。resource://com.your.packagename/“+R.raw。
    
    我认为您需要了解这一点。如果您已经阅读了
    通用图像加载器的源代码,您必须知道,在提供图像的url后,将图像加载到
    图像视图中的顺序是:内存、SD卡(如果已设置)、internet。这意味着您调用
    图像加载器。显示(url、图像视图);
    ,它将首先从
    内存
    中查找
    位图
    ,如果它不存在,它将从
    SD卡
    中查找图像文件,如果文件存在,它将把文件转换成
    位图
    ,然后将
    位图
    加载到
    图像视图
    中并将其存储在备忘录中Y.但是如果文件不存在,它将下载
    url
    的图像文件,然后将文件存储到
    SD卡中
    ,并将文件转换为
    位图
    ,并将
    位图
    加载到内存中。最重要的是,如果您对我上面的内容感到困惑,我建议您阅读它的源代码


    因此,您无需从内存加载
    位图
    图像加载器
    将为您完成此操作。

    让我们选择自己的方案,以便我们的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);
    

    不,我想从内存加载图像。我知道如何从资产文件夹读取文件,谢谢。我知道这个过程,但我需要显示加密的图像,如果我不从内存读取,我就有机会解密。解决方法是解密图像,然后将其存储到SD卡,然后通过UIL显示,但这需要很多时间和执行这是不好的。