最近在学IOS,发现IOS加载图片不像Android那样,动不动就
OOM(Out of memory)
,下面看看一个比较通用的方法。。
先摆个阵
先上个布局文件
1 |
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" |
Activity代码
1 |
public class extends Activity { |
我们使用的图片
好啦,上车吧
Options的inSampleSize
在
BitmapFactory.decodeXXX
中我们都可以看到有一个Options
的参数。我们可以设置这个参数,从而使图片按照预期加载。
属性说明
下面是Options
的两个基本属性:
1、当
inJustDecodeBounds为true
的时候,Android系统并不会去加载图片的具体数据,只会提取图片的轮廓信息。在这里我们就可以防止加载大图片进来的时候把内存给挤爆。
2、上面获取了宽高有怎样????这样我们就可以根据比例去挑中inSampleSize
的值,inSampleSize
可以告诉系统加载Bitmap的时候按照怎样的比例去加载(按照1/inSampleSize
去加载),这样在加载进来系统之前就已经处理好了,就不会挤爆内存了。
代码
1 |
public void showThumbImage(View v) { |
1 |
public Bitmap thumbImageWithInSampleSize(float destWidth,float destHeight) { |
1 |
double scaleW = Math.max(destWidth,opt.outWidth) * 1.0) - 0.5; |
使用
-0.5
是因为最后缩放的是1/inSampleSize
倍。
下面的方法慎用
使用矩阵变换
矩阵在图像领域中的应用非常广泛,只要给出对应的矩阵,就能实现缩放、平移等操作。但是在Android中我们并不需要自己构造矩阵,一切早已被封装好了。例如下面的
matrix.postScale(scaleW,scaleH)
,直接得到特定缩放比例后的矩阵。
1 |
public void showThumbImage(View v) { |
1 |
public Bitmap thumbImageWithMatrix(float destWidth,float destHeight) { |
ThumbnailUtils
其实Android也给我们提供一个
ThumbnailUtils
工具类,直接就可以生成缩略图,不过跟上面一样,需要去先加载Bitmap,所以也不能解决OOM错误
1 |
public void showThumbImage(View v) { |
1 |
public Bitmap thumbImageWithThumbnailUtils(float destWidth,R.drawable.img); |