当前位置:   article > 正文

Android知识总结:Universal-Imageloader学习笔记4 使用Universal-Imageloader管理本地图片_universalimageloader加载本地图片

universalimageloader加载本地图片

ImageLoader管理本地图片

前面我们讨论了ImageLoader在图片下载与缓存中的一些使用方法,那么为什么我们要用ImageLoader管理本地图片呢?
考虑以下一些情况
在App中,我们常常会进行位图的处理,如果我们需要将图片生成的位图保存,是否能结合到我们的图片框架中?最近项目需要将一张位图做模糊处理,这样的逐点操作非常消耗内存和时间,如果我们直接将处理好的位图压缩并存储在本地,下次打开时就不需要再次处理。
我们经常需要下载很多图片,假如我们要做一个网络相册,用户想修改相册中的一些图片,修改完后要上传。但是我们知道,ImageLoader的硬盘缓存命名并非标准的图片格式,我们无法预览和上传。所以我们必须知道这些图片的存储位置,然后将其拷贝出来,将文件名改成我们服务器规定的命名格式,然后再上传。
综上,我们统一管理图片的各种路径和命名,这样ImageLoder不仅是一个图片加载框架,而完全变成了App的图片管理框架。根据目前的需要,添加了两个功能,日后再不断完善。
结合昨天写的拍照裁剪相关的博文,我们在此打造一个功能比较全面的图片管理demo。

包含功能

1.ImageLoader框架的所有功能
2.图片的拍照、选取及裁剪
3.对拍照图片进行处理的,并将处理结果保存到本地,同时使用ImageLoader加载这种图片
4.根据Uri将网络图片的硬盘缓存文件获取到并拷贝到我们的指定路径下,指定文件命名

其中前两条可以参考以前的博文,今天主要实现了后面两条功能。

主要流程

文件结构管理

  1. /**
  2. * Created by vonchenchen on 2015/12/11 0011.
  3. */
  4. public class ImageLoaderManager {
  5. //ImageView 的文件缓存
  6. public final static String FILE_IMAGELOADER_CACHE = Environment
  7. .getExternalStorageDirectory().getAbsolutePath()
  8. + "/vonchenchen/ImageLoaderCache/";
  9. //保存裁剪后照片的路径
  10. public final static String FILE_SAVEPATH = Environment
  11. .getExternalStorageDirectory().getAbsolutePath()
  12. + "/vonchenchen/Portrait/";
  13. //保存直接拍照后未经剪裁照片的路径
  14. public final static String FILE_SAVEPATH_CAMERA = Environment
  15. .getExternalStorageDirectory().getAbsolutePath()
  16. + "/vonchenchen/Camera/";
  17. //保存经过模糊处理后的图片路径
  18. public final static String FILE_SAVEPATH_FUZZY = Environment
  19. .getExternalStorageDirectory().getAbsolutePath()
  20. + "/vonchenchen/Fuzzy/";
  21. //使用ImageLoader下载后需要上传的图片,单独拷贝到这个目录下,并将文件名修改为相应的格式
  22. public final static String FILE_SAVEPATH_UPLOAD = Environment
  23. .getExternalStorageDirectory().getAbsolutePath()
  24. + "/vonchenchen/Upload/";
  25. //裁剪后照片的前缀名 文件名:FILE_SAVENAME + timeStamp + ".jpg"
  26. public final static String FILE_SAVENAME_CROP = "vonchenchen";
  27. //直接拍照后照片的前缀名 文件名:FILE_SAVENAME_CAMERA + timeStamp + ".jpg"/other
  28. public final static String FILE_SAVENAME_CAMERA = "vonchenchen";
  29. }


管理生成的位图

分析见注释
  1. //解压图片
  2. protraitBitmap = ImageUtils.convertToBitmap(protraitPath, 200, 200);
  3. //将位图进行处理
  4. protraitBitmap = BlurUtil.blurBitmap(protraitBitmap, MainActivity.this);
  5. //将处理结果压缩为jpeg,写入指定文件
  6. protraitUri = saveCroppedImage(protraitBitmap, "test");
  7. //用ImageLoader加载这个文件 此处没有知道option,默认不使用内存缓存,可以根据实际情况进行调整
  8. ImageLoader.getInstance().displayImage(protraitUri.toString(), mImageView, new ImageLoadingListener() {
  9. @Override
  10. public void onLoadingStarted(String s, View view) {
  11. }
  12. @Override
  13. public void onLoadingFailed(String s, View view, FailReason failReason) {
  14. }
  15. @Override
  16. public void onLoadingComplete(String s, View view, Bitmap bitmap) {
  17. //clearDocument(FILE_SAVEPATH_FUZZY);
  18. }
  19. @Override
  20. public void onLoadingCancelled(String s, View view) {
  21. }
  22. });
  23. }

管理下载缓存

ImageLoader下载后的图片命名是使用FileNameGenerator接口来设置,默认是Uri的HashCode。所以我们可以打开ImageLoader的缓存文件夹进行查看,里面的文件都是数字,但是由于没有后缀名,所以手机并不能识别。我们可以尝试给这些文件加个后缀,比如如果下载的是jpeg图,那么就加个.jpg,我们就会发现图片可以正常显示。找到这个图片,了解了其命名是用Uri的hashCode时,就可以获取图片的路径,此时我们即可将图片拷贝到另一个用于管理图片的文件中,并且修改其命名。由于ImageLoader中的硬盘缓存可能被回收,所以如果我们可能需要这张图,就在其下载完毕后立即拷贝。

  1. //获取图片在硬盘缓存上的路径
  2. String path = getImageLoaderDiskCacheImageName(uriStr, new HashCodeFileNameGenerator());
  3. System.out.print(path);
  4. //将图片从ImageView维护的硬盘缓存中取出,拷贝到我们指定的路径下
  5. File file = copyToUpLoadFileAndRename(path, "upload.jpg");
  6. //获取当前图片,这种常用于下载后上传,需要知道图片路径
  7. String uploadPath = file.getAbsolutePath();


获取文件名
  1. /**
  2. * 获取ImageLoader的硬盘缓存中对应的路径
  3. * @param uriStr 图片资源uri
  4. * @param generator 给图片设置名字的generator,需要和config的config中设置的generator一样
  5. * @return
  6. */
  7. private String getImageLoaderDiskCacheImageName(String uriStr, FileNameGenerator generator){
  8. String name = generator.generate(uriStr);
  9. String path = ImageLoaderManager.FILE_IMAGELOADER_CACHE + name;
  10. return path;
  11. }

拷贝文件
  1. /**
  2. * 将图片从ImageLoader的硬盘缓存路径拷贝到上传路径,并指定新的文件名
  3. * 复制成功返回复制的文件
  4. * @param path 源路径
  5. * @param newName 我们指定的文件名
  6. */
  7. public File copyToUpLoadFileAndRename(String path, String newName){
  8. File src = new File(path);
  9. File des = new File(ImageLoaderManager.FILE_SAVEPATH_UPLOAD + newName);
  10. String savePath = "";
  11. String storageState = Environment.getExternalStorageState();
  12. if (storageState.equals(Environment.MEDIA_MOUNTED)) {
  13. savePath = ImageLoaderManager.FILE_SAVEPATH_UPLOAD;
  14. File savedir = new File(savePath);
  15. if (!savedir.exists()) {
  16. savedir.mkdirs();
  17. }
  18. }
  19. if(copyToAnotherDocument(src, des) != -1){
  20. return des;
  21. }else{
  22. return null;
  23. }
  24. }
  1. /**
  2. * 将一个文件拷贝到指定文件目录下,并修文件名
  3. * @param src
  4. * @param des
  5. */
  6. private int copyToAnotherDocument(File src, File des){
  7. //long time=new Date().getTime();
  8. int length=1024*10;
  9. try {
  10. FileInputStream in=new FileInputStream(src);
  11. FileOutputStream out=new FileOutputStream(des);
  12. byte[] buffer=new byte[length];
  13. while(true){
  14. int ins=in.read(buffer);
  15. if(ins==-1){
  16. in.close();
  17. out.flush();
  18. out.close();
  19. //return new Date().getTime()-time;
  20. return 1;
  21. }else
  22. out.write(buffer,0,ins);
  23. }
  24. }catch (Exception e){
  25. }finally {
  26. }
  27. return -1;
  28. }


这样,无论是网络加载的图片还是我们自己生成的图片,都被我们抓住了。需要注意的是,使用下载时,我们可以灵活使用option配置ImageLoader的任务,根据不同的情景使确定是否使用内存缓存以及硬盘缓存。







声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/105798
推荐阅读
相关标签
  

闽ICP备14008679号