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显示,但这需要很多时间和执行这是不好的。