最近在看有关Android 图片处理的相关内容,看到Android developer 上有这方面的练习指导,在此将自己看到的内容进行翻译一下,省的每次用时都再去看英文了。
这是原文链接:http://developer.android.com/training/displaying-bitmaps/load-bitmap.html#read-bitmap,小女不才,翻译如下:
1.图片形状大小各异,而且在很多情况下,他们的大小和我们应用界面的大小并不相符。例如:Gallery是个用来展示照片的应用,但是一般你相机的像素要比你手机的像素高。也就是说展示给你的图片其实并不是原生的拍摄的图片。注(蓝色字体个人理解,只做参考)
鉴于我们的手机的内存有限,很多情况下,我们希望下一个低像素版本的图片来节省内存。因为低像素的图片能更好的适应我们的UI以便展示出来,因为高像素的图片在我们的手机上并没有更好的视觉效果,而且还占用了我们的内存,在缩放方面也表现欠缺。
这节课将教我们通过解码一个大的图片使之不超出我们程序的内存,方法为缩小图像生成缩略图。
了解图片的尺寸和类型
为了解码不同类型的源资源来生成bitmap,BitmapFactory类提供了几个不同的方法(
(
decodeByteArray()
,
decodeFile()
,
decodeResource()
, etc.))。根据你要压缩的图片的数据类型来选择最合适的方法。这些方法总是回想着给生成的bitmap分配内存,所以很容易造成内存溢出异常(
OutOfMemory
exception)。每个解码方法可以通过
BitmapFactory.Options
来指定一些解码的选项。为了避免分配内存,将inJustDecodeBounds
属性设置为true,虽然返回的bitmap为空,但是可以得到原图片的宽,高和图片的源类型。这些方法可以让你在构建bitmap之前获得原图片的尺寸和类型。
为了避免内存溢出异常的出现,你要在解码之前了解你要安排的bitmap的尺寸大小。除非你有十足的把握知道你要解码的图片大小能完美的适合现有的程序内存。
下载一个缩略版的图片到内存
既然图片的原尺寸知道了,那么我们就可以决定是原图下载还是进行缩略图下载,下面是我们需要考虑的因素:
1.估算原图下载(无缩小版)的要占用的内存
2.在程序提供的内存的基础上你决定给该bitmap提供的内存大小
3.要承载该bitmap的imageview或者ui的控件的尺寸大小
4.当前手机设备的屏幕大小和像素密度
例如在一个大小为128x96像素大小的imageview上展示图片,没必要下一个像素为1024x768的图片存至内存。
将
BitmapFactory.Options
对象的inSampleSize
为true,可以帮助分辨用来缩略图片的解码方法。例如:解码一个像素为2048X1536的图片,如果解析方法的inSampleSize
为4,那么就会产生一个大约512X384像素的bitmap,这个图片占的内存就是0.75M而非原图片的12M,下面是一个根据缩略后的目的图大小而计算缩小倍数的例子。
用下面的方法生成缩略图时,首先将inJustDecodeBounds设置为ture,将这个option传递过去并且用上述计算出来的缩略倍数进行缩略,然后再将
inJustDecodeBounds
设置为false
:
这个方法让一个任意大小的图片展示在一个100X100像素的imageview变得简单。如以下代码所示:
OK,文章翻译完毕,下次就可以直接看咯!