云计算笔记之engineer-day-01-云计算应用管理
一、概述
我们在开发中会遇到需要显示高清大图的时候,如果直接将图片显示,会出现OOM的情况,接下来介绍两种加载大图的方式。
二、有损压缩
有损压缩的原理是在使用BitmapFactory.decodeResource获取Bitmap对象时,设置inSampleSize,默认不压缩这个值就是1,大于1表示压缩。那么在使用过程中具体设置多大呢?这里就需要有两个值来确定,第一个是图片的实际宽高,第二个是期望压缩后图片的宽高,通过这两个值就能计算出inSampleSize。下面我们来看下具体的步骤:
1、计算图片的实际宽高
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
int width = options.outWidth;
int height = options.outHeight;
将inJustDecodeBounds设置为true表示不要把图片加载到内存中,只需要获取图片的宽高,这样不会占用内存,同样此时得到的Bitmap也是为null。
2、计算inSampleSize
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
//计算出实际宽高和目标宽高的比率
final int widthRatio = Math.round((float) width / (float) reqWidth);
final int heightRatio = Math.round((float) height / (float) reqHeight);
//选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高一定都会大于等于目标的宽和高
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
reqWidth和reqHeight是我们期望的大小,通过两者计算出inSampleSize。
3、具体使用
public static int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
//原图片的宽高
final int width = options.outWidth;
final int height = options.outHeight;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
//计算出实际宽高和目标宽高的比率
final int widthRatio = Math.round((float) width / (float) reqWidth);
final int heightRatio = Math.round((float) height / (float) reqHeight);
//选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高一定都会 大于等于目标的宽和高
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
Log.i(TAG, "widthRatio = " + widthRatio + ", heightRatio = " + heightRatio + ", inSampleSize = " + inSampleSize);
}
return inSampleSize;
}
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
int reqWidth, int reqHeight) {
//inJustDecodeBounds设置为true,来获取图片大小,不会将图片加载到内存中
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);
//计算inSampleSize值
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
//inJustDecodeBounds设置为false,需要将图片加载到内存中
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
}
调用:
Bitmap bitmap = decodeSampledBitmapFromResource(getResources(), R.mipmap.flower,
1080, 1920);
image_compress.setImageBitmap(bitmap);
注意:如果压缩后的图片显示有变形,可以试着设置下面两个属性:
android:adjustViewBounds="true"
android:scaleType="fitXY"
三、无损压缩
无损压缩是通过BitmapRegionDecoder这个类来实现的,原理是只加载当前需要显示的区域到内存中来达到减小内存的目的。下面我们来看下具体的步骤:
1、得到BitmapRegionDecoder对象
以上是它的API,我们通过newInstance方法传入InputStream来得到BitmapRegionDecoder对象。
2、获取需要显示的Bitmap
通过调用BitmapRegionDecoder的decodeRegion方法来获取Bitmap,其中一个参数是Rect,这个表示我们希望显示图片的区域。
3、具体实现
try {
InputStream inputStream = getAssets().open("flower.jpg");
//获取图片的宽高,但不加载到内存中
BitmapFactory.Options tmpOptions = new BitmapFactory.Options();
tmpOptions.inJustDecodeBounds = true;
BitmapFactory.decodeStream(inputStream, null, tmpOptions);
int mImageWidth = tmpOptions.outWidth;
int mImageHeight = tmpOptions.outHeight;
//获取BitmapRegionDecoder,并设置相关参数
BitmapRegionDecoder mDecoder = BitmapRegionDecoder.newInstance(inputStream, false);
BitmapFactory.Options mOptions = new BitmapFactory.Options();
mOptions.inPreferredConfig = Bitmap.Config.RGB_565;
//显示图片
Rect rect = new Rect(mImageWidth / 2 - 400, mImageHeight / 2 - 400,
mImageWidth / 2 + 400, mImageHeight / 2 + 400);
Bitmap newBitmap = mDecoder.decodeRegion(rect, mOptions);
image_view.setImageBitmap(newBitmap);
} catch (IOException e) {
e.printStackTrace();
}
这里首先还是获取了图片的实际宽高,然后再根据读取图片的数据流得到BitmapRegionDecoder,再设置需要显示的大小rect,最后调用decodeRegion方法得到bitmap显示出来。
上面代码展示的是显示图片固定一个区域,当我们想滑动来查看整个图片时,可以自定义一个View,监听手势滑动来改变Rect显示区域,具体代码可下载查看。
相关信息
- 云计算笔记之engineer-day-01-云计算应用管理
- 云计算管理平台之OpenStack计算服务nova
- 云计算相关学习笔记
- 云计算之云数据库
- 云计算学习笔记002---云计算的理解及介绍,google云计算平台实现原理
- 服务器托管云计算应用发展解析
- 云计算 概述
- 云计算浅谈
- 云计算开始。。。
- 云计算基础知识第一讲:云计算概念
- 云计算管理平台之OpenStack计算服务nova
- 云计算与虚拟化笔记1:云计算分类及体系分层、GFS架构概述
- 云计算、云服务
- 云计算的概念
- 云计算运营—01 华为云计算解决方案介绍
- 云计算Day02
- 1+X云计算-项目管理
- 云计算究竟是什么?为什么要学习云计算?
- 云计算术语扫盲
- [云计算]OpenStack - Nova
- 云计算的理解
- 云计算的基本概念
- 云计算IaaS服务模式
- 云计算的服务类型
- 云计算二十年简史
- 云计算管理平台之OpenStack启动虚拟机实例
- 海计算 云计算 雾计算 边缘计算 介绍
- 云计算
- 云计算管理平台之OpenStack认证服务Keystone
- 云计算管理平台之OpenStack网络服务neutron
- 云计算与云原生浅析
- 云计算 = “潘多拉”?
- 云计算管理平台之OpenStack Web管理工具dashboard
- 云计算管理平台之OpenStack块存储服务cinder
- 【学习笔记】云计算概述
- 云计算学习笔记-001---对云计算的了解
- 详解分布式云计算和数据治理
- 云计算管理平台之OpenStack简介及基础环境搭建
- 你了解云计算吗?——谈谈对云计算的理解
- 云计算助力大数据分析
- 云计算的基本概念(转载)
- 云计算:云的组成,架构
- 【云计算】阿里云-Region、VPC、VSwitch
- 1+X云计算-LVM
- 云计算之路-新篇章-出海记:开篇
- 初识云计算:历史、服务、架构
- 云计算的背后到底是什么?
- 云计算中的存储基础知识
- 一文看懂云计算、雾计算、霾计算、边缘计算以及认知计算
- 云计算--简简单单介绍,轻轻松松理解
热门资讯
推荐资讯
最新资讯
- 每个程序员必学的10个Git命令
- 学习 WCF (4)--学会使用配置文件 无论是Web应用程序还是Win应用程序,我们都会经常用到配置文件。WCF作为分布式开发的基础框架,在定义服务以及定义消费服务的客户端时,都使用了配置文件的方法...
- WCF 新手教程二
- Hibernate为什么如此成功?
- Dubbo线程模型
- 概述异步编程模型
- BM00002——|Javase|MS-DOS(Microsoft Disk Operating|
- MS-DOS 6.22 +Vim+masm 汇编环境
- 批量下载 Windows 零散系统更新的得力工具 -Windows Updates Downloader
- NO.A.0002——day01——MS-DOS(Microsoft Disk Operating System)
- ubuntu 中文拼音输入法安装
- 在ubuntu10.10下安装Google谷歌拼音输入法
- [转]ubuntu14.04安装好用的google拼音输入法
- (转)[GIT]Fatal: cannot do a partial commit during a merge
- libevent(十四)http client 请求 (GET、POST)
- Mysql 保存float数组的一种方式
- 极简主义
- JVM调优
- JVM调优-GC基本原理和调优关键分析
- 通过日志分析,实现 Kubernetes Helm Release 的自动回滚
评论