Android-Universal-Image-Loader图片加载框架使用

本文详细介绍了Android-Universal-Image-Loader库的使用方法,包括其特点、使用方法及示例。库提供了多线程图像加载、多种配置选项、图片缓存与显示定制等功能,支持网络请求、本地文件、SD卡等多种资源加载方式,并且具有自定义显示参数、添加加载监听器、支持Widget等特性。本文还提供了关键代码示例,帮助开发者快速上手。


一、介绍

     Android-Universal-Image-Loader是一个非常强大的开源的图片异步加载库,提供一个可重复使用的仪器为异

步图加载,缓存和显示,而且使用也非常简单。使用它我们可以少考虑加载图片遇到的多线程,缓存,内存溢出等

很多方面的问题。国内外很多有名的应用程序都有使用,在该类库的默认缓存文件夹中甚至发现了google,

instagram, qq, baidu都有在用。 Android-Universal-Image-Loader的代码托管在GitHub上:

https://github.com/nostra13/Android-Universal-Image-Loader

本文已同步到个人对立域名博客:http://www.fengchaokm.com/


加载显示任务流
这里写图片描述

二、特点

多线程的图像加载

尽可能多的配置选项(线程池,加载器,解析器,内存/磁盘缓存,显示参数等等)

图片可以缓存在内存中,或者设备文件目录下,或者SD卡中

可以添加图片加载监听器

可以自定义显示每一张图片时都带不同参数

支持Widget

Android 1.5以上支持

1.9.4+版本添加了一个新的API:DisplayImageOptions.targetSize(ImageSize),提供可设置图片的大小。

三、使用方法

1、涉及权限:

通过网络加载图片涉及到网络请求权限

<code class="hljs xml has-numbering"><span style="font-size:18px;"><span style="font-family:SimSun;"><span class="hljs-tag"><<span class="hljs-title">uses-permission</span> <span class="hljs-attribute">android:name</span>=<span class="hljs-value">"android.permission.INTERNET"</span> /></span>  </span></span></code>


缓存设置需要设置权限

<code class="hljs xml has-numbering"><span style="font-size:18px;"><span style="font-family:SimSun;"><span class="hljs-tag"><<span class="hljs-title">uses-permission</span> <span class="hljs-attribute">android:name</span>=<span class="hljs-value">"android.permission.WRITE_EXTERNAL_STORAGE"</span> /></span>  </span></span></code>

2、URL类型:

<code class="hljs cs has-numbering"><span style="font-size:18px;"><span style="font-family:SimSun;"><span class="hljs-string">"http://site.com/image.png"</span> <span class="hljs-comment">// from Web 从网络获取</span>
<span class="hljs-string">"file:///mnt/sdcard/image.png"</span> <span class="hljs-comment">// from SD card 从SD卡获取</span>
<span class="hljs-string">"file:///mnt/sdcard/video.mp4"</span> <span class="hljs-comment">// from SD card (video thumbnail)</span>
<span class="hljs-string">"content://media/external/images/media/13"</span><span class="hljs-comment">//from content provider 从内容提供器获取</span>
<span class="hljs-string">"content://media/external/video/media/13"</span> <span class="hljs-comment">// from content provider (video thumbnail)</span>
<span class="hljs-string">"assets://image.png"</span> <span class="hljs-comment">// from assets 从assets目录获取</span>
<span class="hljs-string">"drawable://"</span> + R.drawable.img <span class="hljs-comment">// from drawables (non-9patch images)</span></span></span></code>


3、MyApplication class

<code class="hljs avrasm has-numbering"><span style="font-family:SimSun;font-size:18px;">public class MyApplication extends Application {
    @Override
    public void onCreate() {
    super<span class="hljs-preprocessor">.onCreate</span>()<span class="hljs-comment">;</span>
    File cacheDir = StorageUtils<span class="hljs-preprocessor">.getCacheDirectory</span>(getApplicationContext())<span class="hljs-comment">;</span>
Environment<span class="hljs-preprocessor">.getExternalStorageDirectory</span>()<span class="hljs-preprocessor">.getPath</span>())<span class="hljs-comment">;</span>
//ImageLoaderConfiguration 
所有的选项都是可选的,只选择你真正想制定的去配置
        ImageLoaderConfiguration config = new ImageLoaderConfiguration<span class="hljs-preprocessor">.Builder</span>(
                getApplicationContext())
    // 如果图片尺寸大于了这个参数,那么就会这按照这个参数对图片大小进行限制并缓存
                <span class="hljs-preprocessor">.memoryCacheExtraOptions</span>(<span class="hljs-number">480</span>, <span class="hljs-number">800</span>)
                <span class="hljs-preprocessor">.taskExecutor</span>(AsyncTask<span class="hljs-preprocessor">.sExecutor</span>)
                <span class="hljs-preprocessor">.taskExecutorForCachedImages</span>(AsyncTask<span class="hljs-preprocessor">.sExecutor</span>)
                <span class="hljs-preprocessor">.threadPoolSize</span>(<span class="hljs-number">5</span>)
                <span class="hljs-preprocessor">.threadPriority</span>(Thread<span class="hljs-preprocessor">.NORM</span>_PRIORITY-<span class="hljs-number">2</span>)
                <span class="hljs-preprocessor">.threadPriority</span>(Thread<span class="hljs-preprocessor">.NORM</span>_PRIORITY - <span class="hljs-number">1</span>)
                <span class="hljs-preprocessor">.tasksProcessingOrder</span>(QueueProcessingType<span class="hljs-preprocessor">.FIFO</span>)
                <span class="hljs-preprocessor">.denyCacheImageMultipleSizesInMemory</span>()
                <span class="hljs-preprocessor">.memoryCache</span>(new LruMemoryCache(<span class="hljs-number">2</span> * <span class="hljs-number">1024</span> * <span class="hljs-number">1024</span>))
                <span class="hljs-preprocessor">.memoryCacheSize</span>(<span class="hljs-number">2</span> * <span class="hljs-number">1024</span> * <span class="hljs-number">1024</span>)
                <span class="hljs-preprocessor">.diskCache</span>(new UnlimitedDiscCache(cacheDir))
                <span class="hljs-preprocessor">.diskCacheSize</span>(<span class="hljs-number">50</span> * <span class="hljs-number">1024</span> * <span class="hljs-number">1024</span>)
                <span class="hljs-preprocessor">.diskCacheFileCount</span>(<span class="hljs-number">100</span>)
                <span class="hljs-preprocessor">.writeDebugLogs</span>()
                <span class="hljs-preprocessor">.build</span>()<span class="hljs-comment">;</span>
        ImageLoader<span class="hljs-preprocessor">.getInstance</span>()<span class="hljs-preprocessor">.init</span>(config)<span class="hljs-comment">;</span>
    }
</span></code>

Display Options

显示参数可以分别被每一个显示任务调用(ImageLoader.displayImage(…))

<code class="hljs r has-numbering"><span style="font-family:SimSun;font-size:18px;">DisplayImageOptions options = new DisplayImageOptions.Builder()
    .showStubImage(R.drawable.ic_stub)  // 在显示真正的图片前,会加载这个资源
    .showImageForEmptyUri(R.drawable.ic_empty) //空的Url时
    .showImageOnFail(R.drawable.ic_error) 
    .resetViewBeforeLoading() // 
    .delayBeforeLoading(<span class="hljs-number">1000</span>)     // 延长1000ms 加载图片  (想不出来用在什么场景下)
    .cacheInMemory()              
    .cacheOnDisc()               
    .preProcessor(<span class="hljs-keyword">...</span>)            
    .postProcessor(<span class="hljs-keyword">...</span>)           
    .extraForDownloader(<span class="hljs-keyword">...</span>)      //可以向加载器携带一些参数 
    .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default  
    .bitmapConfig(Bitmap.Config.ARGB_8888) // default
    .decodingOptions(<span class="hljs-keyword">...</span>)
    .displayer(new SimpleBitmapDisplayer()) // default
    .handler(new Handler()) // default
    .build();</span></code>


简单实例

<code class="hljs java has-numbering"><span style="font-size:18px;"><span style="font-family:SimSun;"><span class="hljs-comment">//无回调方法</span>
imageLoader.displayImage(imageUri, imageView);
<span class="hljs-comment">// 有回调方法</span>
imageLoader.loadImage(imageUri, <span class="hljs-keyword">new</span> SimpleImageLoadingListener() {
    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onLoadingComplete</span>(String imageUri, View view, Bitmap loadedImage) {
        <span class="hljs-comment">// Do whatever you want with Bitmap</span>
    }
});
<span class="hljs-comment">// 返回Bitmap对象</span>
Bitmap bmp = imageLoader.loadImageSync(imageUri);</span></span></code>


完整版

<code class="hljs r has-numbering"><span style="font-family:SimSun;font-size:18px;">// Load image, decode it to Bitmap and display Bitmap <span class="hljs-keyword">in</span> ImageView (or any other view 
//  which implements ImageAware interface)
imageLoader.displayImage(imageUri, imageView, options, new ImageLoadingListener() {
    @Override
    public void onLoadingStarted(String imageUri, View view) {
        <span class="hljs-keyword">...</span>
    }
    @Override
    public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
        <span class="hljs-keyword">...</span>
    }
    @Override
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
        <span class="hljs-keyword">...</span>
    }
    @Override
    public void onLoadingCancelled(String imageUri, View view) {
        <span class="hljs-keyword">...</span>
    }
}, new ImageLoadingProgressListener() {
    @Override
    public void onProgressUpdate(String imageUri, View view, int current, int total) {
        <span class="hljs-keyword">...</span>
    }
});


// Load image, decode it to Bitmap and <span class="hljs-keyword">return</span> Bitmap to callback
ImageSize targetSize = new ImageSize(<span class="hljs-number">80</span>, <span class="hljs-number">50</span>); // result Bitmap will be fit to this size
imageLoader.loadImage(imageUri, targetSize, options, new SimpleImageLoadingListener() {
    @Override
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
        // Do whatever you want with Bitmap
    }
});

// Load image, decode it to Bitmap and <span class="hljs-keyword">return</span> Bitmap synchronously
ImageSize targetSize = new ImageSize(<span class="hljs-number">80</span>, <span class="hljs-number">50</span>); // result Bitmap will be fit to this size
Bitmap bmp = imageLoader.loadImageSync(imageUri, targetSize, options);</span></code>
一、数据采集层:多源人脸数据获取 该层负责从不同设备 / 渠道采集人脸原始数据,为后续模型训练与识别提供基础样本,核心功能包括: 1. 多设备适配采集 实时摄像头采集: 调用计算机内置摄像头(或外接 USB 摄像头),通过OpenCV的VideoCapture接口实时捕获视频流,支持手动触发 “拍照”(按指定快捷键如Space)或自动定时采集(如每 2 秒采集 1 张),采集时自动框选人脸区域(通过Haar级联分类器初步定位),确保样本聚焦人脸。 支持采集参数配置:可设置采集分辨率(如 640×480、1280×720)、图像格式(JPG/PNG)、单用户采集数量(如默认采集 20 张,确保样本多样性),采集过程中实时显示 “已采集数量 / 目标数量”,避免样本不足。 本地图像 / 视频导入: 支持批量导入本地人脸图像文件(支持 JPG、PNG、BMP 格式),自动过滤非图像文件;导入视频文件(MP4、AVI 格式)时,可按 “固定帧间隔”(如每 10 帧提取 1 张图像)或 “手动选择帧” 提取人脸样本,适用于无实时摄像头场景。 数据集对接: 支持接入公开人脸数据集(如 LFW、ORL),通过预设脚本自动读取数据集目录结构(按 “用户 ID - 样本图像” 分类),快速构建训练样本库,无需手动采集,降低系统开发与测试成本。 2. 采集过程辅助功能 人脸有效性校验:采集时通过OpenCV的Haar级联分类器(或MTCNN轻量级模型)实时检测图像中是否包含人脸,若未检测到人脸(如遮挡、侧脸角度过大),则弹窗提示 “未识别到人脸,请调整姿态”,避免无效样本存入。 样本标签管理:采集时需为每个样本绑定 “用户标签”(如姓名、ID 号),支持手动输入标签或从 Excel 名单批量导入标签(按 “标签 - 采集数量” 对应),采集完成后自动按 “标签 - 序号” 命名文件(如 “张三
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值