首先,存储在磁盘上的图片是被压缩过的(以JPG,PNG或类似的格式存储)。 一旦将图片加载到内存中,它就不再被压缩,并占用尽可能多的图片的所有像素所需的内存空间。
其次,加载大图的步骤:
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格式的时候,修改是无效的。
网友评论