Displaying Bitmaps Efficiently (一)-----Loading Large Bitmaps Efficiently(二)

在多媒体应用中,位图无处不在,但是如果加载到内存中的图片尺寸大于屏幕上要显示的图片尺寸时,这些高分辨率的图片便会引发许多性能问题。为了减轻应用的内存压力,必须要调整加载到内存中的位图大小。


需要想办法让图片以实际要显示的尺寸大小载入内存,而不是以完整的高分辨率进行加载。如果用户想要查看完整分辨率的图片,可以根据需要显示图片并加载到内存中。


 这里要用到Android中的缩放位图(Scaling Bitmap)方法.

可以使用如下方法创建一个特定尺寸大小的Bitmap:

Displaying Bitmaps Efficiently (一)-----Loading Large Bitmaps Efficiently(二)_第1张图片


但是有一个缺点,此方法需要先要有一个位图才能使用,也就是说,系统必须先加载图片、解码并创建位图然后才能创建新的特定的尺寸更小的位图。


1》可以在加载位图时调整Bitmap的尺寸大小,这时就要用到BitmapOption对象的inSampleSize属性了。

Displaying Bitmaps Efficiently (一)-----Loading Large Bitmaps Efficiently(二)_第2张图片

public int inSampleSize

Added in API level 1

If set to a value > 1, requests the decoder to subsample the original image, returning a smaller image to save memory. The sample size is the number of pixels in either dimension that correspond to a single pixel in the decoded bitmap. For example, inSampleSize == 4 returns an image that is 1/4 the width/height of the original, and 1/16 the number of pixels. Any value <= 1 is treated the same as 1. Note: the decoder uses a final value based on powers of 2, any other value will be rounded down to the nearest power of 2.(当inSampleSize的值不是2的多少次方时,就取比它小的、最接近的2的次方数)



2》但是如果你希望指定的图片绽放尺寸不是2的次方时,你需要用到以下方法:

Displaying Bitmaps Efficiently (一)-----Loading Large Bitmaps Efficiently(二)_第3张图片


Displaying Bitmaps Efficiently (一)-----Loading Large Bitmaps Efficiently(二)_第4张图片

从上面bitmapfactory.cpp实现中可以看出,当设置inScaled 标记后,系统会用目标密度除以当前密度,计算出位图要应用的缩放值。使用这种方法不仅可以调整图片尺寸,还可以为其应用调整尺寸的滤镜,也就是在调整尺寸的过程中加入一些额外的运算以使最后呈现的效果更加出色。但是额外应用滤镜会增加处理时间 ,对于大型图片而言,这会放缓图片尺寸的调整速度。

3>解决方案:将以上两种方法结合起来使用。

Displaying Bitmaps Efficiently (一)-----Loading Large Bitmaps Efficiently(二)_第5张图片

 (1)首先将inSampleSize应用到图片,将图片调整为目标尺寸的1/4(长、宽各1/4).

(2)然后使用inDensity 和inTargetDensity缩放图片,以使图片尺寸完全符合你想要的尺寸。

由于inSampleSize会减少像素数量,并在随后的密度处理过程中为图片应用调整尺寸的滤镜,因此结合这两种方法可以提高处理速度。

4> 如何获取图片的原始尺寸?

Displaying Bitmaps Efficiently (一)-----Loading Large Bitmaps Efficiently(二)_第6张图片


你可能感兴趣的:(bitmap)