热门标签 | 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对象 在通过这个对象就可得到缓存文件的输入流


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本教程涵盖OpenGL基础操作及直线光栅化技术,包括点的绘制、简单图形绘制、直线绘制以及DDA和中点画线算法。通过逐步实践,帮助读者掌握OpenGL的基本使用方法。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 帝国CMS多图上传插件详解及使用指南
    本文介绍了一款用于帝国CMS的多图上传插件,该插件通过Flash技术实现批量图片上传功能,显著提升了多图上传效率。文章详细说明了插件的安装、配置和使用方法。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 网易严选Java开发面试:MySQL索引深度解析
    本文详细记录了网易严选Java开发岗位的面试经验,特别针对MySQL索引相关的技术问题进行了深入探讨。通过本文,读者可以了解面试官常问的索引问题及其背后的原理。 ... [详细]
  • HBase运维工具全解析
    本文深入探讨了HBase常用的运维工具,详细介绍了每种工具的功能、使用场景及操作示例。对于HBase的开发人员和运维工程师来说,这些工具是日常管理和故障排查的重要手段。 ... [详细]
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社区 版权所有