热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

图片加载,压缩,缓存

Bitmap的高效加载BitmapFactory提供了四类方法:decodeFiledecodeStreamdecodeResourcedecodeByteArray;分别送文件系

Bitmap的高效加载

BitmapFactory提供了四类方法:decodeFile decodeStream decodeResource decodeByteArray;

分别送 文件系统 资源 输入流 字节数组中加载出一个bitmap对象;其中decodeFile decodeResource间接调用了decodeStream;

图片存储格式

《图片加载,压缩,缓存》 存储方法
《图片加载,压缩,缓存》

我们知道ARGB指的是一种色彩模式,里面A代表Alpha,R表示red,G表示green,B表示blue.

其实所有的可见色都是右红绿蓝组成的,所以红绿蓝又称为三原色,每个原色都存储着所表示颜色的信息值

ALPHA_8就是Alpha由8位组成

ARGB_4444就是由4个4位组成即16位

ARGB_8888就是由4个8位组成即32位

RGB_565就是R为5位,G为6位,B为5位共16位

位图位数越高代表其可以存储的颜色信息越多,当然图像也就越逼真

高效加载bitmap核心思想就是采用BitmapFactory.Options来加载所需要的尺寸图片。通过bitmapFactory.Options可以按一定采样率来加载缩小后的图片 然后再显示在imageView中这样会降低内存占用从而从一定程度上避免OOM提供加载性能。

BitmapFactory.Options来缩放图片主要是通过它的inSampleSize参数即采样率 当inSampleSize为1时采样后的图片为原始图片大小;为2时为原始图片的二分之一,像素数为原始图的四分之一内存占用大小也为四分之一;inSampleSize的取值应该为2的指数 1 2 4  6 8 ;

如何获取采样率?

1 将BitmapFactory.Options的inJustDecodeBounds参数设置为true;

2 从bitmapFactory.Options中取出图片的原始宽高信息对应与outWidth和outHeight;

3 根据采样率规则并结合目标view计算出所需要的采样率inSampleSize;

4 将BitmapFactory.options的injustDecodeBounds参数设置为false 然后重新加载图片view;

进过这四个步骤加载出来的图片就是最终缩放后的图片

Android中的缓存策略;

缓存策略核心思想:程序第一次从网络加载图片后将其缓存在存储设备上这样下次使用图片时候就不用从网络中获取了为用户节省了流量;有时候为了提升用户体验还会吧图片在内存中缓存一份这样当app打算从网络中请求图片时候程序就会先从内存中获取如果没有就从存储设备中获取如果存储设备也没有再从网络加载;

同样这种思想也适合与其他文件;

缓存策略主要包含缓存的 添加 获取和 删除 三类操作;

为什么要删除缓存呢 因为内存的大小是有限的因此在使用缓存的是总要为缓存设置一个最大容量;

android中常用的缓存算法为LRU(Least Recently Used)

LRU有两种LruCache(内存缓存)和DiskLruCache(存储设备缓存);

LruCache是一个泛型类内部采用了一个LinkedHashMap以强引用的方式存储外界的缓存对象 是线程安全的;

提供了get和put方法来完成缓存的获取和添加操作;

强引用  直接的对象引用

软引用  当一个对象只有软引用时 系统内存不足时就会被GC回收掉;

弱引用  当一个对象只有弱引用时 可能随便会被Gc回收掉;

DiskLruCache不属于androidSDK的一部分

DiskLruCache的创建  

不能通过构造方法创建而是提供了open 方法创建自身 

open方法的四个参数(文件系统的路径,应用的版本号,单个节点对应的数据个数一般为一,缓存文件的总大小);

缓存的添加  

添加操作  通过Editor完成

缓存的获取  通过get方法得到一个Snapshot对象 在通过这个对象就可得到缓存文件的输入流


推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
author-avatar
攻玉是我_944
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有