扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
首先,存储在磁盘上的图片是被压缩过的(以JPG,PNG或类似的格式存储)。 一旦将图片加载到内存中,它就不再被压缩,并占用尽可能多的图片的所有像素所需的内存空间。
创新互联公司-专业网站定制、快速模板网站建设、高性价比靖安网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式靖安网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖靖安地区。费用合理售后完善,10多年实体公司更值得信赖。
其次,加载大图的步骤:
1.获取图片的宽和高:BitmapFactory.Options
BitmapFactory可以为我们提供图片的元数据。我们可以使用这个类来实现第一步。
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds =true;//不想将图片加载到内存中。获取图片的相关信息(宽度,高度等),并使用这些信息来计算缩放比例。
BitmapFactory.decodeResource(getResources(), R.mipmap.hqimage, options);
2.根据图片的宽和高计算缩放比Reducing Image Size (In Memory)
:现在我们需要计算 inSampleSize 。其是BitmapFactory.Options类的一个属性,用于设置图片的缩放比。
如果我们有一张尺寸为1000x1000的图片,并且在解码之前设置inSampleSize的值为2, 那么解码之后,我们将得到一张尺寸为500x500的图片。
BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds =true;options.inSampleSize = 3; BitmapFactory.decodeResource(getResources(), R.mipmap.hqimage, options);
注意:inSampleSize 设置为 5 , 最终 会被 取整为 4
3.根据缩放比将图片加载到内存中。Reducing Image Size (In Disk)
我们还可以使用Bitmap的 compress 方法对磁盘上的图片进行压缩。我们来看看在不改变图片质量的情况下图片被压缩后的大小。 100 表示与原图保持相同的质量。
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
byte[] bitmapdata = bos.toByteArray();
通过计算得到图片在磁盘上的大小为1.6 MB。
我们把compress方法中的质量参数改为50,并再次计算图片大小
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, bos);
通过计算得到图片在磁盘上的大小为24.4 KB。
注意 :在改变compress方法中的质量参数的时候,压缩格式应该是.JPEG。设置为PNG格式的时候,修改是无效的。
由于Bitmap的特殊性以及Android对单个应用所规定的最大内存限制,我们在同时加载大量Bitmap时很容易发生内存溢出,即我们通常所说的OutOfMemoryError(OOM),因此高效加载Bitmap就成为了每个Android开发者的必备技能。
在学习如何高效地加载Bitmap之前,首先介绍一下如何加载一个Bitmap。我们都知道,Bitmap在Android中通常指的是一张图片,那么如何将JPG、PNG等格式的图片转换成Bitmap对象呢?BitmapFactory类给我们提供了一些方法:
接下来开始介绍如何高效地加载Bitmap,其实核心思想很简单: 就是采用BitmapFactory.Options参数来调整图片尺寸来适配控件的大小。
假如我们显示图片的控件ImageView宽高为100×100像素,而图片的尺寸为1024×1024像素,这个时候如果将整个图片加载进来并显示到控件上,自然是很占用内存资源的。这个时候可以通过BitmapFactory.Options按一定的采样率加载缩小后的图片,再将缩小后的图片显示到ImageView中,这样就能减小内存占用从而在一定程度上避免OOM的发生。
通过BitmapFactory.Options来缩放图片,主要是使用它的inSampleSize参数,也就是前面提到的采样率。当采样率inSampleSize为1时,采样后的图片大小为原图大小;当采样率inSampleSize1,比如为2时,采样后的图片宽高都为原图的1/2,即像素降为原图的1/4,占用的内存大小也就是原图的1/4;比较特殊的是,当采样率inSampleSize1时,系统会自动将该值当做1来处理。 因此可以得出一个结论:采样率inSampleSize必须是大于1的整数图片才会有缩小的效果,并且采样率同时作用于宽高,也就是说采样后的图片会缩小到原图的1/(inSampleSize^2)。比如inSampleSize=4,那么缩放比例为1/16。
我们现在知道了,通过采样率可以提高图片的加载效率,那么如何才能计算出最合适的采样率?我们可以按照如下流程:
接下来以decodeFile方法为例实现图片的缩放,其他三个方法处理方式类似。
下一篇: Android 图片加载(二)图片加载框架Glide 入门篇
《Android开发艺术探索》
1.展示高分辨率图片的时候,最好先将图片进行压缩
2.比例大小压缩
3.质量压缩
4.使用图片压缩库进行压缩
5.如果加载的图片太大,手机屏幕显示不完,使用局部加载
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流